stratagem 0.1.9 → 0.2.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 (36) hide show
  1. data/Manifest +10 -4
  2. data/Rakefile +1 -1
  3. data/lib/stratagem/authentication.rb +1 -1
  4. data/lib/stratagem/auto_mock/aquifer.rb +4 -4
  5. data/lib/stratagem/auto_mock/factory.rb +5 -5
  6. data/lib/stratagem/client.rb +3 -2
  7. data/lib/stratagem/crawler/authentication.rb +5 -13
  8. data/lib/stratagem/crawler/form.rb +11 -1
  9. data/lib/stratagem/crawler/parameter_resolver.rb +5 -9
  10. data/lib/stratagem/crawler/route_invoker.rb +78 -7
  11. data/lib/stratagem/crawler/session.rb +15 -8
  12. data/lib/stratagem/crawler/site_model.rb +12 -4
  13. data/lib/stratagem/extensions.rb +1 -0
  14. data/lib/stratagem/extensions/hash.rb +12 -1
  15. data/lib/stratagem/extensions/net.rb +10 -0
  16. data/lib/stratagem/framework_extensions.rb +1 -0
  17. data/lib/stratagem/framework_extensions/method_invocation.rb +10 -2
  18. data/lib/stratagem/framework_extensions/models/adapters/{active_model → active_record}/detect.rb +0 -0
  19. data/lib/stratagem/framework_extensions/models/adapters/{active_model → active_record}/extensions.rb +0 -0
  20. data/lib/stratagem/framework_extensions/models/adapters/{active_model → active_record}/metadata.rb +0 -0
  21. data/lib/stratagem/framework_extensions/models/adapters/{active_model → active_record}/tracing.rb +1 -1
  22. data/lib/stratagem/framework_extensions/models/adapters/devise/detect.rb +11 -0
  23. data/lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb +0 -0
  24. data/lib/stratagem/framework_extensions/models/adapters/devise/metadata.rb +30 -0
  25. data/lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb +4 -0
  26. data/lib/stratagem/framework_extensions/models/tracing.rb +1 -0
  27. data/lib/stratagem/framework_extensions/request_forgery_protection.rb +16 -0
  28. data/lib/stratagem/model/application.rb +13 -1
  29. data/lib/stratagem/model/components/base.rb +1 -1
  30. data/lib/stratagem/model/components/controller.rb +8 -1
  31. data/lib/stratagem/model/components/model.rb +1 -1
  32. data/lib/stratagem/model/components/route.rb +2 -2
  33. data/lib/stratagem/model_builder.rb +22 -41
  34. data/stratagem.gemspec +4 -4
  35. data/templates/install/tasks/stratagem.rake +1 -1
  36. metadata +24 -12
data/Manifest CHANGED
@@ -33,6 +33,7 @@ lib/stratagem/extensions.rb
33
33
  lib/stratagem/extensions/class.rb
34
34
  lib/stratagem/extensions/hash.rb
35
35
  lib/stratagem/extensions/module.rb
36
+ lib/stratagem/extensions/net.rb
36
37
  lib/stratagem/extensions/object.rb
37
38
  lib/stratagem/extensions/red_parse.rb
38
39
  lib/stratagem/extensions/string.rb
@@ -40,10 +41,10 @@ lib/stratagem/extensions/trace_compression.rb
40
41
  lib/stratagem/framework_extensions.rb
41
42
  lib/stratagem/framework_extensions/method_invocation.rb
42
43
  lib/stratagem/framework_extensions/models.rb
43
- lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb
44
- lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb
45
- lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb
46
- lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb
44
+ lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb
45
+ lib/stratagem/framework_extensions/models/adapters/active_record/extensions.rb
46
+ lib/stratagem/framework_extensions/models/adapters/active_record/metadata.rb
47
+ lib/stratagem/framework_extensions/models/adapters/active_record/tracing.rb
47
48
  lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb
48
49
  lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb
49
50
  lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb
@@ -52,6 +53,10 @@ lib/stratagem/framework_extensions/models/adapters/common/detect.rb
52
53
  lib/stratagem/framework_extensions/models/adapters/common/extensions.rb
53
54
  lib/stratagem/framework_extensions/models/adapters/common/metadata.rb
54
55
  lib/stratagem/framework_extensions/models/adapters/common/tracing.rb
56
+ lib/stratagem/framework_extensions/models/adapters/devise/detect.rb
57
+ lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb
58
+ lib/stratagem/framework_extensions/models/adapters/devise/metadata.rb
59
+ lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb
55
60
  lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb
56
61
  lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb
57
62
  lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb
@@ -70,6 +75,7 @@ lib/stratagem/framework_extensions/rails.rb
70
75
  lib/stratagem/framework_extensions/rails2/action_controller.rb
71
76
  lib/stratagem/framework_extensions/rails2/action_mailer.rb
72
77
  lib/stratagem/framework_extensions/rails3/parameters.rb
78
+ lib/stratagem/framework_extensions/request_forgery_protection.rb
73
79
  lib/stratagem/interface/browser.rb
74
80
  lib/stratagem/interface/public/images/backgrounds/content.png
75
81
  lib/stratagem/interface/public/images/backgrounds/shadow.png
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('stratagem', '0.1.9') do |p|
5
+ Echoe.new('stratagem', '0.2.0') 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"
@@ -28,7 +28,7 @@ module Stratagem
28
28
 
29
29
  def base_url
30
30
  subdomain = credentials ? credentials[:account] : 'www'
31
- "http://#{subdomain}.#{Stratagem.domain}"
31
+ "https://#{subdomain}.stratagemapp.com"
32
32
  end
33
33
 
34
34
  def project_url
@@ -18,7 +18,7 @@ module Stratagem::AutoMock
18
18
  i = 0
19
19
  while (objects.size > 0 && ((i+=1) < objects.size))
20
20
  objects = objects.select do |instance|
21
- puts "deleting #{instance.class.name}"
21
+ # puts "deleting #{instance.class.name}"
22
22
  begin
23
23
  instance.destroy
24
24
  rescue
@@ -41,13 +41,13 @@ module Stratagem::AutoMock
41
41
 
42
42
  def instances_of(model_klass)
43
43
  objects = (repo[model_klass.name] || []).clone
44
- puts "found #{objects.size} instances in well"
44
+ # puts "found #{objects.size} instances in well"
45
45
  objects
46
46
  end
47
47
 
48
48
  def random_instance(model_klass)
49
49
  objects = repo[model_klass.name]
50
- puts "found #{objects.size} instances in well"
50
+ # puts "found #{objects.size} instances in well"
51
51
  instance = objects[rand objects.size]
52
52
  instance
53
53
  end
@@ -57,7 +57,7 @@ module Stratagem::AutoMock
57
57
  application.models.each do |meta_model|
58
58
  models = mock_model(meta_model.klass, model_count) if (meta_model.stratagem?)
59
59
  end
60
- puts "aquifer full"
60
+ # puts "aquifer full"
61
61
  print
62
62
  self
63
63
  end
@@ -76,9 +76,9 @@ module Stratagem::AutoMock
76
76
 
77
77
  exclude_regex = [/^photo/, /picture/]
78
78
  names = object.stratagem.attribute_names.select {|n| n !~ /_id$/ } - exclude
79
- puts "mocking names: #{names.inspect}"
80
- puts "excluded: #{exclude.inspect}"
81
- puts "internal: #{object.stratagem.internal_attributes.inspect}"
79
+ # puts "mocking names: #{names.inspect}"
80
+ # puts "excluded: #{exclude.inspect}"
81
+ # puts "internal: #{object.stratagem.internal_attributes.inspect}"
82
82
  names.each do |attr_name|
83
83
  next if exclude_regex.find {|r| attr_name =~ r }
84
84
  set_attribute_value(object, attr_name, mock_chain)
@@ -182,7 +182,7 @@ module Stratagem::AutoMock
182
182
  puts $!.backtrace unless valid
183
183
  end
184
184
 
185
- puts "\t#{object.stratagem.mock_attributes.inspect}" if (valid)
185
+ # puts "\t#{object.stratagem.mock_attributes.inspect}" if (valid)
186
186
 
187
187
  valid
188
188
  end
@@ -207,7 +207,7 @@ module Stratagem::AutoMock
207
207
 
208
208
  confirmation_writer = "#{attr_name}_confirmation="
209
209
  if object.methods_include?(confirmation_writer) || (object.stratagem.validations(attr_name, :validates_confirmation_of).size > 0)
210
- puts "setting confirmation field for #{attr_name}"
210
+ # puts "setting confirmation field for #{attr_name}"
211
211
  object.send(confirmation_writer, value)
212
212
  object.stratagem.write_mock_attribute("#{attr_name}_confirmation".to_sym, value)
213
213
  end
@@ -9,14 +9,15 @@ module Stratagem
9
9
  def send(snapshot)
10
10
  Stratagem.logger.debug "Sending report to server"
11
11
  url = URI.parse("#{@authentication.base_url}/snapshots")
12
- req = Net::HTTP::Post.new(url.path)
12
+ req = Net::HTTPS::Post.new(url.path)
13
+
13
14
  req.set_form_data({
14
15
  'auth_token' => @authentication.credentials[:token],
15
16
  'project_id' => @authentication.credentials[:project],
16
17
  'timestamp' => snapshot.timestamp.to_i,
17
18
  'model' => snapshot.model.export.to_json
18
19
  }, ';')
19
- res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
20
+ res = Net::HTTPS.new(url.host, url.port).start {|http| http.request(req) }
20
21
  puts "response:"
21
22
  case res
22
23
  when Net::HTTPSuccess, Net::HTTPRedirection
@@ -1,6 +1,6 @@
1
1
  module Stratagem::Crawler
2
2
  class AuthenticationData
3
- attr_accessor :success, :login_page, :form, :response_page, :ssl
3
+ attr_accessor :success, :login_page, :form, :response_page, :ssl, :authenticated_with
4
4
  end
5
5
 
6
6
 
@@ -44,7 +44,7 @@ module Stratagem::Crawler
44
44
  route = application_model.routes.recognize(request.path, :post)
45
45
 
46
46
  redirected_to = nil
47
- page = site_model.add(route, request, response) {|redirect_url| redirected_to = redirect_url }
47
+ page = site_model.add(route, controller, request, response) {|redirect_url| redirected_to = redirect_url }
48
48
  authentication.response_page = page
49
49
 
50
50
  begin
@@ -61,9 +61,11 @@ module Stratagem::Crawler
61
61
  puts "authenticated? #{authentication.success}"
62
62
  if (response && authentication.success)
63
63
  authentication.ssl = request.ssl?
64
+ authentication.authenticated_with = user
64
65
  yield
65
66
  logout
66
67
  else
68
+ puts response.body
67
69
  false
68
70
  end
69
71
  end
@@ -74,11 +76,8 @@ module Stratagem::Crawler
74
76
  puts "locating login page"
75
77
  puts "testing #{site_models.first.pages.size} pages"
76
78
  site_models.first.pages.sort {|a,b| b.inbound_edges(:redirect).size <=> a.inbound_edges(:redirect).size }.each do |page|
77
- puts "Testing page #{page.url} for sign in form"
78
- # page.reload {|url| get url; response }
79
- # form = page.login_form
80
79
  if (page.login_form)
81
- puts "FOUND! - #{page.login_form}"
80
+ puts "\tfound login form - #{page.login_form}"
82
81
  authentication.login_page = page
83
82
  return page
84
83
  end
@@ -96,7 +95,6 @@ module Stratagem::Crawler
96
95
  def login(user)
97
96
  populate_login_form(user).submit {|action,params|
98
97
  post(action, params)
99
- # puts response.body
100
98
  }
101
99
  end
102
100
 
@@ -122,10 +120,7 @@ module Stratagem::Crawler
122
120
  def populate_login_form(user)
123
121
  # set up the form
124
122
  page = find_login_form
125
- p page.login_form
126
123
  page.reload {|url| get url; [request,response] }
127
- p page.login_form
128
- p page.response.body
129
124
  form = page.login_form
130
125
 
131
126
  # map the input values
@@ -161,9 +156,6 @@ module Stratagem::Crawler
161
156
  puts user.stratagem.mock_attributes.inspect
162
157
  puts "ERROR: Cannot find attribute #{attribute_name} in model #{user.class.name}"
163
158
  end
164
-
165
- puts "3 authentication field: #{input.name} -> #{input.value}"
166
-
167
159
  end
168
160
  form
169
161
  end
@@ -1,7 +1,7 @@
1
1
  # Primarily used to fill out login forms rather than trying to fudge the before_filters
2
2
  module Stratagem::Crawler
3
3
  class Form
4
- attr_accessor :action, :method, :fields, :buttons
4
+ attr_accessor :action, :method, :fields, :buttons, :page
5
5
  attr_reader :inputs, :buttons
6
6
 
7
7
  def initialize
@@ -17,6 +17,12 @@ module Stratagem::Crawler
17
17
  end
18
18
  end
19
19
 
20
+ def implied_method
21
+ implied = inputs.find {|i| i.name == '_method' }
22
+ implied ? implied.value : nil
23
+ end
24
+
25
+
20
26
  def password?
21
27
  !(inputs.find {|i| i.type == 'password' }.nil?)
22
28
  end
@@ -25,6 +31,10 @@ module Stratagem::Crawler
25
31
  response = block.call(action, generate_parameters)
26
32
  end
27
33
 
34
+ def parameter_keys
35
+ @parameter_keys ||= inputs.map {|input| input.name }
36
+ end
37
+
28
38
  def generate_parameters
29
39
  params = {}
30
40
  inputs.each do |input|
@@ -2,21 +2,18 @@ module Stratagem::Crawler
2
2
  module ParameterResolver
3
3
 
4
4
  def resolve_parameter_types(route_container)
5
- log "\tresolving parameter types"
6
5
  resolved_params = {}
7
6
  route_infos, params = build_url(route_container, resolved_params)
8
7
  route_info = route_infos.first
9
8
  unknown_params = params.keys
10
- log "\tunknown params: #{unknown_params.inspect} - #{unknown_params.size}"
11
9
 
12
- resolve_with_convention(unknown_params, resolved_params)
13
- log "\tunknown params after convention: #{unknown_params.inspect} - #{unknown_params.size}"
10
+ if (unknown_params.size > 0)
11
+ resolve_with_convention(unknown_params, resolved_params)
12
+ resolve_with_instrumentation(route_container, resolved_params)
14
13
 
15
- resolve_with_instrumentation(route_container, resolved_params)
16
- log "\tunknown params after instrumentation: #{unknown_params.inspect} - #{unknown_params.size}"
14
+ log "\tresolved parameter types - #{resolved_params.inspect}"
15
+ end
17
16
 
18
- p resolved_params
19
-
20
17
  if (resolved_params.size > 0)
21
18
  resolved_params
22
19
  else
@@ -33,7 +30,6 @@ module Stratagem::Crawler
33
30
  while ((unknown_params.size > 0) && (progress.nil? || (progress > 0)))
34
31
  progress = 0
35
32
 
36
- puts "\tloading model invocations for request"
37
33
  delta = model_invocations_for_request do
38
34
  call_route(route_info, false)
39
35
  end
@@ -2,8 +2,10 @@ module Stratagem::Crawler
2
2
  module RouteInvoker
3
3
  include Stratagem::Crawler::ParameterResolver
4
4
 
5
+ IGNORE_PARAMETERS = [:utf8, :_method, :authenticity_token, 'utf8', '_method', 'authenticity_token']
6
+
5
7
  def visit(route_container)
6
- puts "Visiting #{route_container.route}"
8
+ # puts "Visiting #{route_container.route}"
7
9
  build_urls(route_container).each do |route_info|
8
10
  call_route(route_info)
9
11
  end
@@ -21,7 +23,7 @@ module Stratagem::Crawler
21
23
  def call_route!(route_info, track_invocations=true)
22
24
  return if route_info.nil?
23
25
 
24
- puts 'CALLING: .'+route_info[:verb].downcase+". - "+route_info[:path]
26
+ puts route_info[:verb].downcase+" "+route_info[:path]
25
27
  verb = route_info[:verb].downcase
26
28
  verb = 'get' if verb == '' || verb == 'any'
27
29
 
@@ -43,8 +45,11 @@ module Stratagem::Crawler
43
45
  if (track_invocations)
44
46
  changes = detect_attribute_changes_in_models(invocations)
45
47
  puts "\tfound #{invocations.size} invocations"
48
+ invocations.each do |i|
49
+ puts "\t\t#{i.controller_action} -> #{i.model_class}"
50
+ end
46
51
  puts "\tchanges: #{changes.values.inspect}" if changes.size > 0
47
- site_model.add(route_info[:route_container], request, response, invocations, changes) {|redirect_url| redirect_proc.call(redirect_url) }
52
+ site_model.add(route_info[:route_container], controller, request, response, invocations, changes) {|redirect_url| redirect_proc.call(redirect_url) }
48
53
  end
49
54
  else
50
55
  puts "ERROR: did not call #{route_info.inspect}"
@@ -56,12 +61,31 @@ module Stratagem::Crawler
56
61
  end
57
62
 
58
63
  def do_put(route_info)
64
+ raise "unable to invoke PUT requests, application must first be crawled with GET requests for phase #{phase}." unless site_model.pages.size > 0
59
65
 
60
- # note: this should fail to generate anything meaningful, as we have not yet set up the parameters
61
- put route_info[:path]
66
+ form = guess_form_for_route(route_info)
67
+
68
+ params = {}
62
69
 
70
+ # note: this should fail to generate anything meaningful, as we have not yet set up the parameters
71
+ hash_reads = Hash.track_parameter_reads do
72
+ begin
73
+ put route_info[:path], params
74
+ rescue
75
+ # TODO - log error as page response
76
+ puts "ERROR: #{response.code}"
77
+ end
78
+ end
79
+
80
+ p hash_reads
81
+
63
82
  # let's find out what the method is looking for in the params object
64
- params = map_models_to_attributes(infer_models_for_param_reads(route_info[:route_container],controller.params.hash_reads))
83
+ models_by_hash_key = infer_models_for_param_reads(route_info[:route_container],hash_reads)
84
+ params = map_models_to_attributes(models_by_hash_key)
85
+
86
+ p params
87
+
88
+ guess_unknown_params(models_by_hash_key, params, form)
65
89
 
66
90
  # run again with the params
67
91
  puts "PUTTING: #{route_info[:path]} with #{params.inspect}"
@@ -73,6 +97,54 @@ module Stratagem::Crawler
73
97
 
74
98
  private
75
99
 
100
+ def guess_unknown_params(models_by_hash_key, known_params, form)
101
+ (form.parameter_keys - IGNORE_PARAMETERS) .each {|path_s|
102
+ path = path_s.split('[')
103
+ path.last.gsub!(']', '')
104
+ value = known_params
105
+ model = nil
106
+ path.each do |key|
107
+ key = key.to_sym
108
+ model = models_by_hash_key[key] if models_by_hash_key[key]
109
+ new_value = value[key]
110
+ if (new_value.nil?)
111
+ new_value = guess_form_value(form, model, key, path_s)
112
+ puts "\t\tno key for #{key}, setting to -> #{new_value}"
113
+ value[key] = new_value if (new_value)
114
+ end
115
+ value = new_value
116
+ end
117
+ }
118
+ end
119
+
120
+ def guess_form_value(form, model, attribute, qualified_attribute)
121
+ # simple guessing for the time being, more sophisticated analysis as required
122
+ if (attribute =~ /password/)
123
+ authentication.authenticated_with.stratagem.read_mock_attribute(:password)
124
+ elsif (form)
125
+ # return the value from the form
126
+ input = form.inputs.find {|i| i.name == qualified_attribute}
127
+ input ? input.value : nil
128
+ else
129
+ nil
130
+ end
131
+ end
132
+
133
+ def guess_form_for_route(route_info)
134
+ forms = []
135
+ pages = site_models.map {|sm| sm.pages }.flatten
136
+ site_models.each do |site_model|
137
+ site_model.pages.each do |page|
138
+ page.forms.each do |form|
139
+ usable = route_info[:route_container].responds_to?(form.action, form.implied_method || form.method)
140
+ # puts "\t#{form.action} - #{form.method} - #{form.implied_method}"
141
+ # puts "\tUSABLE" if usable
142
+ forms << form if (usable)
143
+ end
144
+ end
145
+ end
146
+ forms.sort {|a,b| a.inputs.size <=> b.inputs.size }.last
147
+ end
76
148
 
77
149
  def map_models_to_attributes(models)
78
150
  result = {}
@@ -175,7 +247,6 @@ module Stratagem::Crawler
175
247
 
176
248
  routes = []
177
249
  url_permutations(route_container,insert_values) do |path|
178
- puts "yielded: #{path}"
179
250
  permutation = {:verb => verb, :path => path, :route_container => route_container}
180
251
  routes << permutation
181
252
  end
@@ -30,7 +30,6 @@ module Stratagem::Crawler::Session
30
30
  include Stratagem::Crawler::TraceUtils
31
31
  include Stratagem::Crawler::Authentication
32
32
  include Stratagem::Crawler::RouteInvoker
33
-
34
33
  attr_writer :aquifer
35
34
 
36
35
  # def self.app
@@ -82,6 +81,9 @@ module Stratagem::Crawler::Session
82
81
  end
83
82
 
84
83
  def page_set(name, &block)
84
+ log "---------------------------------------"
85
+ log "Crawling page set #{name}"
86
+ log "---------------------------------------"
85
87
  reset!
86
88
  site_models << Stratagem::Crawler::SiteModel.new(name)
87
89
  yield site_model
@@ -108,12 +110,7 @@ module Stratagem::Crawler::Session
108
110
 
109
111
  # grab all pages independently
110
112
 
111
- authentication_controller = nil
112
- if (site_model.authentication)
113
- route = application_model.routes.recognize(authentication.login_page)
114
- authentication_controller = route.controller if route
115
- end
116
-
113
+ authentication_controller = session_controller()
117
114
  application_model.routes.each {|route_container|
118
115
  if authentication_controller && route_container.controller && (route_container.controller.klass == authentication_controller.klass)
119
116
  log "Skipping authentication routes #{route_container.route.to_s}"
@@ -136,6 +133,16 @@ module Stratagem::Crawler::Session
136
133
  site_model
137
134
  end
138
135
 
136
+ def session_controller
137
+ authentication_controller = nil
138
+ if (site_model.authentication)
139
+ route = application_model.routes.recognize(authentication.login_page)
140
+ authentication_controller = route.controller if route
141
+ end
142
+
143
+ authentication_controller
144
+ end
145
+
139
146
  private
140
147
 
141
148
  def handle_redirect(redirect_url)
@@ -147,7 +154,7 @@ module Stratagem::Crawler::Session
147
154
  get redirect_url
148
155
  end
149
156
 
150
- site_model.add(nil, request, response) {|redirect_url|
157
+ site_model.add(nil, controller, request, response) {|redirect_url|
151
158
  # TODO - record as bug!
152
159
  puts "recursive redirect #{redirect_url}"
153
160
  }
@@ -29,8 +29,8 @@ module Stratagem::Crawler
29
29
  self.edges << Edge.new(from,to,type)
30
30
  end
31
31
 
32
- def add(route, request, response, invocations=[], model_changes={}, &block)
33
- page = Page.new(self, request, response, invocations, model_changes, &block)
32
+ def add(route, controller, request, response, invocations=[], model_changes={}, &block)
33
+ page = Page.new(self, controller, request, response, invocations, model_changes, &block)
34
34
  self.pages << page
35
35
  page
36
36
  end
@@ -75,10 +75,11 @@ module Stratagem::Crawler
75
75
  attr_accessor :redirected_to
76
76
  attr_accessor :document
77
77
 
78
- def initialize(site_model, request, response, invocations, model_changes, &block)
78
+ def initialize(site_model, controller, request, response, invocations, model_changes, &block)
79
79
  @site_model = site_model
80
80
  @invocations = invocations
81
81
  @model_changes = model_changes
82
+ @authenticity_checked = controller.authenticity_checked?
82
83
  init(request, response, &block)
83
84
  end
84
85
 
@@ -96,6 +97,7 @@ module Stratagem::Crawler
96
97
  :route_external_id => route ? route.object_id : nil,
97
98
  :references => @invocations.map {|i| i.to_reference.export },
98
99
  :model_changes => Hash[@model_changes.map {|model,changes| [model.object_id, changes] }].to_json,
100
+ :authenticity_checked => @authenticity_checked,
99
101
  :parameters => @request.parameters.to_json
100
102
  }
101
103
  h
@@ -123,7 +125,13 @@ module Stratagem::Crawler
123
125
  end
124
126
 
125
127
  def forms
126
- self.parse_forms(@document)
128
+ @forms ||= begin
129
+ forms = self.parse_forms(@document)
130
+ forms.each do |form|
131
+ form.page = self
132
+ end
133
+ forms
134
+ end
127
135
  end
128
136
 
129
137
  def login_form
@@ -1,3 +1,4 @@
1
+ require 'stratagem/extensions/net'
1
2
  require 'stratagem/extensions/red_parse'
2
3
  require 'stratagem/extensions/class'
3
4
  require 'stratagem/extensions/string'
@@ -2,11 +2,22 @@ class Hash
2
2
  alias_method :ruby_get, :[]
3
3
  attr_reader :hash_reads, :hash_writes
4
4
 
5
+ @@listeners = {}
6
+
5
7
  def [](name)
6
- (@hash_reads ||= []) << name if (@auditing)
8
+ if (@auditing)
9
+ @@listeners.values.each {|listener| listener << name }
10
+ (@hash_reads ||= []) << name
11
+ end
7
12
  ruby_get name
8
13
  end
9
14
 
15
+ def self.track_parameter_reads(&block)
16
+ @@listeners[block] = []
17
+ yield
18
+ @@listeners.delete(block)
19
+ end
20
+
10
21
  def enable_auditing
11
22
  @auditing = true
12
23
  end
@@ -0,0 +1,10 @@
1
+ require 'net/http'
2
+
3
+ module Net
4
+ class HTTPS < HTTP
5
+ def initialize(address, port = nil)
6
+ super(address, port)
7
+ self.use_ssl = true
8
+ end
9
+ end
10
+ end
@@ -3,6 +3,7 @@ module Stratagem::ApplicationExtensions; end
3
3
  require 'stratagem/framework_extensions/rails'
4
4
  require 'stratagem/framework_extensions/method_invocation'
5
5
  require 'stratagem/framework_extensions/models'
6
+ require 'stratagem/framework_extensions/request_forgery_protection'
6
7
 
7
8
  if (Stratagem.rails_3?)
8
9
  require 'stratagem/framework_extensions/rails3/parameters'
@@ -10,6 +10,7 @@ module Stratagem::ApplicationExtensions
10
10
  args.each_with_index do |val,i|
11
11
  self.send("#{arg_keys[i].to_s}=", val)
12
12
  end
13
+ self.controller_path = controller_path.gsub(/.*?\/app/, 'app') if controller_path
13
14
  end
14
15
 
15
16
  def <=>(other)
@@ -28,10 +29,17 @@ module Stratagem::ApplicationExtensions
28
29
  }.nil?
29
30
  end
30
31
 
31
- def to_reference
32
+ def controller
32
33
  app = Stratagem::Model::Application.instance
33
- model = model_class ? app.models.find {|model| model.klass == model_class } : nil
34
34
  controller = controller_path ? app.controllers.find {|controller| controller.path == controller_path } : nil
35
+ end
36
+
37
+ def model
38
+ app = Stratagem::Model::Application.instance
39
+ model = model_class ? app.models.find {|model| model.klass.name == model_class.name } : nil
40
+ end
41
+
42
+ def to_reference
35
43
  Stratagem::Model::Component::Reference.new(
36
44
  :from_component => controller,
37
45
  :to_component => model,
@@ -53,7 +53,7 @@ module Stratagem::ApplicationExtensions::Models::Adapters::ActiveRecord
53
53
  end
54
54
  end
55
55
 
56
- stratagem.write_invocation(self, alternate_model || self.class, action.to_sym, args)
56
+ stratagem.write_invocation(self, alternate_model || self.class, action ? action.to_sym : '', args)
57
57
  old_create_or_update(*args)
58
58
  end
59
59
 
@@ -0,0 +1,11 @@
1
+ module Stratagem::ApplicationExtensions::Models::Adapters::Devise
2
+ class Detect < Stratagem::ApplicationExtensions::Models::Detect
3
+ def self.supports?(model)
4
+ begin
5
+ model.methods.include?(:devise_modules)
6
+ rescue
7
+ false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ module Stratagem::ApplicationExtensions::Models::Adapters::Devise
2
+
3
+ # prefix method names with to avoid collision
4
+ class Metadata
5
+ include Stratagem::ApplicationExtensions::Models::Adapters::Common::AuthenticationMetadata
6
+
7
+ VIRTUAL_COLUMNS = [:password, :password_confirmation]
8
+
9
+ def authenticates?
10
+ true
11
+ end
12
+
13
+ def initialize(model)
14
+ @model = model
15
+ end
16
+
17
+ def attribute_names
18
+ VIRTUAL_COLUMNS
19
+ end
20
+
21
+ def internal_attributes
22
+ [:encrypted_password, :password_salt]
23
+ end
24
+
25
+ def attribute_type(name)
26
+ :string
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,4 @@
1
+ module Stratagem::ApplicationExtensions::Models::Adapters::Devise
2
+ module Tracing
3
+ end
4
+ end
@@ -75,6 +75,7 @@ module Stratagem::ApplicationExtensions::Models
75
75
 
76
76
  def parse_trace_line(trace_line)
77
77
  path,line,action = trace_line.split(':')
78
+ path = path.gsub(/.*?\/app/, 'app')
78
79
  if (action)
79
80
  action.gsub!(/[`']/, '').gsub!('in ', '')
80
81
  line = line.to_i
@@ -0,0 +1,16 @@
1
+ module ActionController #:nodoc:
2
+ module RequestForgeryProtection
3
+ def authenticity_checked?
4
+ @authenticity_checked || false
5
+ end
6
+
7
+ def authenticity_checked
8
+ @authenticity_checked = true
9
+ end
10
+
11
+ def verify_authenticity_token
12
+ authenticity_checked
13
+ true
14
+ end
15
+ end
16
+ end
@@ -104,6 +104,10 @@ module Stratagem::Model
104
104
  @components.find{|component| yield component }
105
105
  end
106
106
 
107
+ def clear
108
+ @components.clear
109
+ end
110
+
107
111
  def size
108
112
  @components.size
109
113
  end
@@ -144,7 +148,15 @@ module Stratagem::Model
144
148
  else
145
149
  path = page
146
150
  end
147
- self.find {|r| r.responds_to?(path, method) }
151
+
152
+ unless path.nil?
153
+ # path = path.gsub('http://www.example.com', '')
154
+ route = self.find {|r| r.responds_to?(path, method) }
155
+ puts "route: #{route.path}"
156
+ route
157
+ else
158
+ nil
159
+ end
148
160
  end
149
161
  end
150
162
 
@@ -6,7 +6,7 @@ module Stratagem::Model::Component
6
6
  attr_accessor :app_model
7
7
 
8
8
  def initialize(path, parse_tree, klass)
9
- @path = path
9
+ @path = path.gsub(/.*?\/app/, 'app')
10
10
  @parse_tree = parse_tree
11
11
  @klass = klass
12
12
  end
@@ -12,20 +12,27 @@ module Stratagem::Model::Component
12
12
  end
13
13
 
14
14
  def model_invocations(type=nil)
15
+ puts "MODEL INVOCATIONS FOR: #{controller.klass.name} / #{name}"
16
+ puts "\t#{Stratagem::ApplicationExtensions::Models::Tracing.invocations_audit.size} total invocations"
15
17
  invocations = []
16
18
  Stratagem::ApplicationExtensions::Models::Tracing.invocations_audit.each {|invocation|
17
19
  if ((invocation.controller_path == controller.path) && (invocation.controller_action.to_s == self.name.to_s))
18
20
  invocations << invocation unless invocations.include?(invocation)
19
21
  end
20
22
  }
23
+ puts "\t#{invocations.size} filtered"
21
24
  invocations = invocations.select {|i| i.type == type } if type
25
+ puts "\t#{invocations.size} selected"
26
+ invocations.each do |i|
27
+ puts "\t\t#{i.model.class.name} - #{i.controller.class.name}"
28
+ end
22
29
  invocations
23
30
  end
24
31
 
25
32
  end
26
33
 
27
34
  class Controller < Base
28
- attr_reader :clazz, :actions
35
+ attr_reader :actions
29
36
  attr_accessor :invalid_routes # named routes linked to the controller that are invalid
30
37
 
31
38
  def initialize(*args)
@@ -134,7 +134,7 @@ module Stratagem::Model::Component
134
134
  :component_type => :model,
135
135
  :path => @path.gsub(RAILS_ROOT+'/', ''),
136
136
  :class_name => @klass.name,
137
- :superclass => @klass.superclass.name,
137
+ :superclass => @klass.methods.include?(:superclass) ? @klass.superclass.name : nil,
138
138
  :included_modules => @klass.included_modules.map {|m| m.name},
139
139
  :attributes => @model_attributes,
140
140
  :foreign_keys => @model_foreign_keys,
@@ -22,7 +22,6 @@ module Stratagem::Model::Component
22
22
  @controller_name = @controller_path.gsub('/','::').split('::').map {|part| part.camelcase }.join('::')
23
23
  @controller_name << 'Controller'
24
24
  end
25
- puts "CONTROLLER INFO: #{@controller_name}, #{@action_name}, #{@verb}, #{controller}"
26
25
  end
27
26
 
28
27
  def responds_to?(path, request_method)
@@ -41,13 +40,14 @@ module Stratagem::Model::Component
41
40
  if (controller_name)
42
41
  begin
43
42
  controller_class = controller_name.constantize
44
- Stratagem::Model::Application.instance.controllers.find {|c| c.klass == controller_class }
43
+ Stratagem::Model::Application.instance.controllers.find {|c| c.klass.name == controller_class.name }
45
44
  rescue
46
45
  puts "unable to determine controller: #{route.requirements[:controller]}"
47
46
  puts $!.message
48
47
  nil
49
48
  end
50
49
  else
50
+ puts "ERROR: no controller name"
51
51
  nil
52
52
  end
53
53
  end
@@ -33,6 +33,7 @@ module Stratagem
33
33
  end
34
34
 
35
35
  def load_plugins()
36
+ @model.plugins.clear
36
37
  if (Stratagem.rails_3?)
37
38
  @model.plugins << Rails.application.railties.plugins
38
39
  else
@@ -43,6 +44,8 @@ module Stratagem
43
44
  end
44
45
 
45
46
  def load_models()
47
+ @model.models.clear
48
+
46
49
  # load files into classes
47
50
  log "loading models"
48
51
  root = File.join(RAILS_ROOT, 'app','models')
@@ -57,6 +60,8 @@ module Stratagem
57
60
  end
58
61
 
59
62
  def load_public
63
+ @model.static_files.clear
64
+
60
65
  log "loading static files"
61
66
  Dir[File.join(RAILS_ROOT, 'public', '**', '*.html')].each {|static|
62
67
  static.gsub!(RAILS_ROOT, '').gsub!(/^\/public\//, '')
@@ -67,6 +72,8 @@ module Stratagem
67
72
  end
68
73
 
69
74
  def load_template_paths
75
+ @model.views.clear
76
+
70
77
  log "loading templates"
71
78
  root = File.join(RAILS_ROOT, 'app','views')
72
79
  load_files(root).map {|template|
@@ -77,58 +84,32 @@ module Stratagem
77
84
  end
78
85
 
79
86
  def load_routes
87
+ @model.routes.clear
88
+ @model.controllers.clear
89
+
80
90
  log 'loading routes'
81
91
  root = File.join(RAILS_ROOT, 'app','controllers')
82
92
  ActionController::Routing::Routes.routes.each {|route|
83
93
  route_container = Stratagem::Model::Component::Route.new(route)
84
94
  @model.routes << route_container
85
-
95
+ p route.requirements
96
+
86
97
  begin
87
- controller = route_container.controller || begin
88
- controller_class = route_container.controller_name.constantize
89
- filename = File.join(root, "#{route_container.controller_path}_controller.rb")
90
- if (File.exists?(filename))
91
- parse_tree = RedParse.new(File.read(filename)).parse
92
- else
93
- parse_tree = nil
94
- end
95
- controller_container = Stratagem::Model::Component::Controller.new(filename, parse_tree, controller_class)
96
- configure_route(route_container, controller_container)
97
- @model.controllers << controller_container
98
+ puts "loading controller - #{route_container.controller_name}"
99
+ controller_class = route_container.controller_name.constantize
100
+ filename = File.join(root, "#{route_container.controller_path}_controller.rb")
101
+ if (File.exists?(filename))
102
+ parse_tree = RedParse.new(File.read(filename)).parse
103
+ else
104
+ parse_tree = nil
98
105
  end
106
+ controller_container = Stratagem::Model::Component::Controller.new(filename, parse_tree, controller_class)
107
+ configure_route(route_container, controller_container)
108
+ @model.controllers << controller_container
99
109
  rescue
100
110
  log "\tinvalid route #{route.to_s} - #{$!.message}"
101
111
  @model.routes.invalid << Stratagem::Model::Component::Route.new(route)
102
112
  end
103
-
104
- # begin
105
- # filename = File.join(root, "#{route_container.controller_path}_controller.rb")
106
- # controllers = @model.controllers.select {|c| c.path == filename }
107
- #
108
- # unless controllers.size > 0
109
- # controllers = Stratagem::Model::Component::Controller.load_all(filename)
110
- # puts "loading controllers from #{filename} -> controllers #{controllers.map {|c| c.klass.name }.inspect}"
111
- # @model.controllers << controllers
112
- # end
113
- #
114
- # configure_route(route_container, controllers)
115
- #
116
- # rescue Errno::ENOENT, MissingSourceFile
117
- # begin
118
- # controller_class = route_container.controller
119
- # if (controller_class)
120
- # log "Attempting to load external controller for: #{route_container.controller_name}"
121
- # controllers = [Stratagem::Model::Component::Controller.new(nil, nil, controller_class)]
122
- # @model.controllers << controllers
123
- # configure_route(route_container, controllers)
124
- # else
125
- # log "\tinvalid route #{route.to_s} - unable to load external controller"
126
- # end
127
- # rescue
128
- # log "\tinvalid route #{route.to_s} - #{$!.message}"
129
- # @model.routes.invalid << Stratagem::Model::Component::Route.new(route)
130
- # end
131
- # end
132
113
  }
133
114
  log ""
134
115
  end
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{stratagem}
5
- s.version = "0.1.9"
5
+ s.version = "0.2.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Charles Grimes"]
9
- s.date = %q{2010-09-30}
9
+ s.date = %q{2010-10-06}
10
10
  s.default_executable = %q{stratagem}
11
11
  s.description = %q{Intuitive security analysis of your Rails applications}
12
12
  s.email = %q{cj@stratagemapp.com}
13
13
  s.executables = ["stratagem"]
14
- s.extra_rdoc_files = ["bin/stratagem", "lib/bootstrap.rb", "lib/generators/stratagem/install/USAGE", "lib/generators/stratagem/install/install_base.rb", "lib/generators/stratagem/install/install_generator.rb", "lib/stratagem.rb", "lib/stratagem/authentication.rb", "lib/stratagem/auto_mock.rb", "lib/stratagem/auto_mock/aquifer.rb", "lib/stratagem/auto_mock/factory.rb", "lib/stratagem/auto_mock/value_generator.rb", "lib/stratagem/blocker.rb", "lib/stratagem/client.rb", "lib/stratagem/command.rb", "lib/stratagem/commands.rb", "lib/stratagem/commands/analyze.rb", "lib/stratagem/commands/base.rb", "lib/stratagem/commands/devel_mock.rb", "lib/stratagem/crawler.rb", "lib/stratagem/crawler/authentication.rb", "lib/stratagem/crawler/form.rb", "lib/stratagem/crawler/html_utils.rb", "lib/stratagem/crawler/parameter_resolver.rb", "lib/stratagem/crawler/route_invoker.rb", "lib/stratagem/crawler/session.rb", "lib/stratagem/crawler/site_model.rb", "lib/stratagem/crawler/trace_utils.rb", "lib/stratagem/extensions.rb", "lib/stratagem/extensions/class.rb", "lib/stratagem/extensions/hash.rb", "lib/stratagem/extensions/module.rb", "lib/stratagem/extensions/object.rb", "lib/stratagem/extensions/red_parse.rb", "lib/stratagem/extensions/string.rb", "lib/stratagem/extensions/trace_compression.rb", "lib/stratagem/framework_extensions.rb", "lib/stratagem/framework_extensions/method_invocation.rb", "lib/stratagem/framework_extensions/models.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/common/detect.rb", "lib/stratagem/framework_extensions/models/adapters/common/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/common/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/common/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/detect.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/util/authentication_metadata.rb", "lib/stratagem/framework_extensions/models/annotations.rb", "lib/stratagem/framework_extensions/models/detect.rb", "lib/stratagem/framework_extensions/models/metadata.rb", "lib/stratagem/framework_extensions/models/mocking.rb", "lib/stratagem/framework_extensions/models/tracing.rb", "lib/stratagem/framework_extensions/rails.rb", "lib/stratagem/framework_extensions/rails2/action_controller.rb", "lib/stratagem/framework_extensions/rails2/action_mailer.rb", "lib/stratagem/framework_extensions/rails3/parameters.rb", "lib/stratagem/interface/browser.rb", "lib/stratagem/interface/public/images/backgrounds/content.png", "lib/stratagem/interface/public/images/backgrounds/shadow.png", "lib/stratagem/interface/public/javascripts/jquery-1.4.2.min.js", "lib/stratagem/interface/public/javascripts/stratagem.js", "lib/stratagem/interface/public/javascripts/stratagem_debug.js", "lib/stratagem/interface/public/stylesheets/960.css", "lib/stratagem/interface/public/stylesheets/reset.css", "lib/stratagem/interface/public/stylesheets/stratagem.css", "lib/stratagem/interface/public/stylesheets/stratagem_debug.css", "lib/stratagem/interface/views/debug.haml", "lib/stratagem/interface/views/index.haml", "lib/stratagem/labs/auto_mock.rb", "lib/stratagem/labs/crawler.rb", "lib/stratagem/logger.rb", "lib/stratagem/model.rb", "lib/stratagem/model/application.rb", "lib/stratagem/model/components/base.rb", "lib/stratagem/model/components/controller.rb", "lib/stratagem/model/components/model.rb", "lib/stratagem/model/components/reference.rb", "lib/stratagem/model/components/route.rb", "lib/stratagem/model/components/static_file.rb", "lib/stratagem/model/components/view.rb", "lib/stratagem/model/parse_util.rb", "lib/stratagem/model_builder.rb", "lib/stratagem/recipes/deploy.rb", "lib/stratagem/scan.rb", "lib/stratagem/scan/checks/capistrano/secure_deploy.rb", "lib/stratagem/scan/checks/email_address.rb", "lib/stratagem/scan/checks/error_pages.rb", "lib/stratagem/scan/result.rb", "lib/stratagem/scanner.rb", "lib/stratagem/site_crawler.rb", "lib/stratagem/snapshot.rb"]
15
- s.files = ["Manifest", "Rakefile", "bin/stratagem", "generators/stratagem/stratagem_generator.rb", "init.rb", "lib/bootstrap.rb", "lib/generators/stratagem/install/USAGE", "lib/generators/stratagem/install/install_base.rb", "lib/generators/stratagem/install/install_generator.rb", "lib/stratagem.rb", "lib/stratagem/authentication.rb", "lib/stratagem/auto_mock.rb", "lib/stratagem/auto_mock/aquifer.rb", "lib/stratagem/auto_mock/factory.rb", "lib/stratagem/auto_mock/value_generator.rb", "lib/stratagem/blocker.rb", "lib/stratagem/client.rb", "lib/stratagem/command.rb", "lib/stratagem/commands.rb", "lib/stratagem/commands/analyze.rb", "lib/stratagem/commands/base.rb", "lib/stratagem/commands/devel_mock.rb", "lib/stratagem/crawler.rb", "lib/stratagem/crawler/authentication.rb", "lib/stratagem/crawler/form.rb", "lib/stratagem/crawler/html_utils.rb", "lib/stratagem/crawler/parameter_resolver.rb", "lib/stratagem/crawler/route_invoker.rb", "lib/stratagem/crawler/session.rb", "lib/stratagem/crawler/site_model.rb", "lib/stratagem/crawler/trace_utils.rb", "lib/stratagem/extensions.rb", "lib/stratagem/extensions/class.rb", "lib/stratagem/extensions/hash.rb", "lib/stratagem/extensions/module.rb", "lib/stratagem/extensions/object.rb", "lib/stratagem/extensions/red_parse.rb", "lib/stratagem/extensions/string.rb", "lib/stratagem/extensions/trace_compression.rb", "lib/stratagem/framework_extensions.rb", "lib/stratagem/framework_extensions/method_invocation.rb", "lib/stratagem/framework_extensions/models.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/common/detect.rb", "lib/stratagem/framework_extensions/models/adapters/common/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/common/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/common/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/detect.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/util/authentication_metadata.rb", "lib/stratagem/framework_extensions/models/annotations.rb", "lib/stratagem/framework_extensions/models/detect.rb", "lib/stratagem/framework_extensions/models/metadata.rb", "lib/stratagem/framework_extensions/models/mocking.rb", "lib/stratagem/framework_extensions/models/tracing.rb", "lib/stratagem/framework_extensions/rails.rb", "lib/stratagem/framework_extensions/rails2/action_controller.rb", "lib/stratagem/framework_extensions/rails2/action_mailer.rb", "lib/stratagem/framework_extensions/rails3/parameters.rb", "lib/stratagem/interface/browser.rb", "lib/stratagem/interface/public/images/backgrounds/content.png", "lib/stratagem/interface/public/images/backgrounds/shadow.png", "lib/stratagem/interface/public/javascripts/jquery-1.4.2.min.js", "lib/stratagem/interface/public/javascripts/stratagem.js", "lib/stratagem/interface/public/javascripts/stratagem_debug.js", "lib/stratagem/interface/public/stylesheets/960.css", "lib/stratagem/interface/public/stylesheets/reset.css", "lib/stratagem/interface/public/stylesheets/stratagem.css", "lib/stratagem/interface/public/stylesheets/stratagem_debug.css", "lib/stratagem/interface/views/debug.haml", "lib/stratagem/interface/views/index.haml", "lib/stratagem/labs/auto_mock.rb", "lib/stratagem/labs/crawler.rb", "lib/stratagem/logger.rb", "lib/stratagem/model.rb", "lib/stratagem/model/application.rb", "lib/stratagem/model/components/base.rb", "lib/stratagem/model/components/controller.rb", "lib/stratagem/model/components/model.rb", "lib/stratagem/model/components/reference.rb", "lib/stratagem/model/components/route.rb", "lib/stratagem/model/components/static_file.rb", "lib/stratagem/model/components/view.rb", "lib/stratagem/model/parse_util.rb", "lib/stratagem/model_builder.rb", "lib/stratagem/recipes/deploy.rb", "lib/stratagem/scan.rb", "lib/stratagem/scan/checks/capistrano/secure_deploy.rb", "lib/stratagem/scan/checks/email_address.rb", "lib/stratagem/scan/checks/error_pages.rb", "lib/stratagem/scan/result.rb", "lib/stratagem/scanner.rb", "lib/stratagem/site_crawler.rb", "lib/stratagem/snapshot.rb", "templates/install/environments/stratagem.rb.erb", "templates/install/tasks/stratagem.rake", "stratagem.gemspec"]
14
+ s.extra_rdoc_files = ["bin/stratagem", "lib/bootstrap.rb", "lib/generators/stratagem/install/USAGE", "lib/generators/stratagem/install/install_base.rb", "lib/generators/stratagem/install/install_generator.rb", "lib/stratagem.rb", "lib/stratagem/authentication.rb", "lib/stratagem/auto_mock.rb", "lib/stratagem/auto_mock/aquifer.rb", "lib/stratagem/auto_mock/factory.rb", "lib/stratagem/auto_mock/value_generator.rb", "lib/stratagem/blocker.rb", "lib/stratagem/client.rb", "lib/stratagem/command.rb", "lib/stratagem/commands.rb", "lib/stratagem/commands/analyze.rb", "lib/stratagem/commands/base.rb", "lib/stratagem/commands/devel_mock.rb", "lib/stratagem/crawler.rb", "lib/stratagem/crawler/authentication.rb", "lib/stratagem/crawler/form.rb", "lib/stratagem/crawler/html_utils.rb", "lib/stratagem/crawler/parameter_resolver.rb", "lib/stratagem/crawler/route_invoker.rb", "lib/stratagem/crawler/session.rb", "lib/stratagem/crawler/site_model.rb", "lib/stratagem/crawler/trace_utils.rb", "lib/stratagem/extensions.rb", "lib/stratagem/extensions/class.rb", "lib/stratagem/extensions/hash.rb", "lib/stratagem/extensions/module.rb", "lib/stratagem/extensions/net.rb", "lib/stratagem/extensions/object.rb", "lib/stratagem/extensions/red_parse.rb", "lib/stratagem/extensions/string.rb", "lib/stratagem/extensions/trace_compression.rb", "lib/stratagem/framework_extensions.rb", "lib/stratagem/framework_extensions/method_invocation.rb", "lib/stratagem/framework_extensions/models.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/common/detect.rb", "lib/stratagem/framework_extensions/models/adapters/common/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/common/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/common/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/devise/detect.rb", "lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/devise/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/detect.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/util/authentication_metadata.rb", "lib/stratagem/framework_extensions/models/annotations.rb", "lib/stratagem/framework_extensions/models/detect.rb", "lib/stratagem/framework_extensions/models/metadata.rb", "lib/stratagem/framework_extensions/models/mocking.rb", "lib/stratagem/framework_extensions/models/tracing.rb", "lib/stratagem/framework_extensions/rails.rb", "lib/stratagem/framework_extensions/rails2/action_controller.rb", "lib/stratagem/framework_extensions/rails2/action_mailer.rb", "lib/stratagem/framework_extensions/rails3/parameters.rb", "lib/stratagem/framework_extensions/request_forgery_protection.rb", "lib/stratagem/interface/browser.rb", "lib/stratagem/interface/public/images/backgrounds/content.png", "lib/stratagem/interface/public/images/backgrounds/shadow.png", "lib/stratagem/interface/public/javascripts/jquery-1.4.2.min.js", "lib/stratagem/interface/public/javascripts/stratagem.js", "lib/stratagem/interface/public/javascripts/stratagem_debug.js", "lib/stratagem/interface/public/stylesheets/960.css", "lib/stratagem/interface/public/stylesheets/reset.css", "lib/stratagem/interface/public/stylesheets/stratagem.css", "lib/stratagem/interface/public/stylesheets/stratagem_debug.css", "lib/stratagem/interface/views/debug.haml", "lib/stratagem/interface/views/index.haml", "lib/stratagem/labs/auto_mock.rb", "lib/stratagem/labs/crawler.rb", "lib/stratagem/logger.rb", "lib/stratagem/model.rb", "lib/stratagem/model/application.rb", "lib/stratagem/model/components/base.rb", "lib/stratagem/model/components/controller.rb", "lib/stratagem/model/components/model.rb", "lib/stratagem/model/components/reference.rb", "lib/stratagem/model/components/route.rb", "lib/stratagem/model/components/static_file.rb", "lib/stratagem/model/components/view.rb", "lib/stratagem/model/parse_util.rb", "lib/stratagem/model_builder.rb", "lib/stratagem/recipes/deploy.rb", "lib/stratagem/scan.rb", "lib/stratagem/scan/checks/capistrano/secure_deploy.rb", "lib/stratagem/scan/checks/email_address.rb", "lib/stratagem/scan/checks/error_pages.rb", "lib/stratagem/scan/result.rb", "lib/stratagem/scanner.rb", "lib/stratagem/site_crawler.rb", "lib/stratagem/snapshot.rb"]
15
+ s.files = ["Manifest", "Rakefile", "bin/stratagem", "generators/stratagem/stratagem_generator.rb", "init.rb", "lib/bootstrap.rb", "lib/generators/stratagem/install/USAGE", "lib/generators/stratagem/install/install_base.rb", "lib/generators/stratagem/install/install_generator.rb", "lib/stratagem.rb", "lib/stratagem/authentication.rb", "lib/stratagem/auto_mock.rb", "lib/stratagem/auto_mock/aquifer.rb", "lib/stratagem/auto_mock/factory.rb", "lib/stratagem/auto_mock/value_generator.rb", "lib/stratagem/blocker.rb", "lib/stratagem/client.rb", "lib/stratagem/command.rb", "lib/stratagem/commands.rb", "lib/stratagem/commands/analyze.rb", "lib/stratagem/commands/base.rb", "lib/stratagem/commands/devel_mock.rb", "lib/stratagem/crawler.rb", "lib/stratagem/crawler/authentication.rb", "lib/stratagem/crawler/form.rb", "lib/stratagem/crawler/html_utils.rb", "lib/stratagem/crawler/parameter_resolver.rb", "lib/stratagem/crawler/route_invoker.rb", "lib/stratagem/crawler/session.rb", "lib/stratagem/crawler/site_model.rb", "lib/stratagem/crawler/trace_utils.rb", "lib/stratagem/extensions.rb", "lib/stratagem/extensions/class.rb", "lib/stratagem/extensions/hash.rb", "lib/stratagem/extensions/module.rb", "lib/stratagem/extensions/net.rb", "lib/stratagem/extensions/object.rb", "lib/stratagem/extensions/red_parse.rb", "lib/stratagem/extensions/string.rb", "lib/stratagem/extensions/trace_compression.rb", "lib/stratagem/framework_extensions.rb", "lib/stratagem/framework_extensions/method_invocation.rb", "lib/stratagem/framework_extensions/models.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/active_record/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/authlogic/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/common/detect.rb", "lib/stratagem/framework_extensions/models/adapters/common/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/common/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/common/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/devise/detect.rb", "lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/devise/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/friendly_id/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/detect.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/extensions.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/metadata.rb", "lib/stratagem/framework_extensions/models/adapters/restful_authentication/tracing.rb", "lib/stratagem/framework_extensions/models/adapters/util/authentication_metadata.rb", "lib/stratagem/framework_extensions/models/annotations.rb", "lib/stratagem/framework_extensions/models/detect.rb", "lib/stratagem/framework_extensions/models/metadata.rb", "lib/stratagem/framework_extensions/models/mocking.rb", "lib/stratagem/framework_extensions/models/tracing.rb", "lib/stratagem/framework_extensions/rails.rb", "lib/stratagem/framework_extensions/rails2/action_controller.rb", "lib/stratagem/framework_extensions/rails2/action_mailer.rb", "lib/stratagem/framework_extensions/rails3/parameters.rb", "lib/stratagem/framework_extensions/request_forgery_protection.rb", "lib/stratagem/interface/browser.rb", "lib/stratagem/interface/public/images/backgrounds/content.png", "lib/stratagem/interface/public/images/backgrounds/shadow.png", "lib/stratagem/interface/public/javascripts/jquery-1.4.2.min.js", "lib/stratagem/interface/public/javascripts/stratagem.js", "lib/stratagem/interface/public/javascripts/stratagem_debug.js", "lib/stratagem/interface/public/stylesheets/960.css", "lib/stratagem/interface/public/stylesheets/reset.css", "lib/stratagem/interface/public/stylesheets/stratagem.css", "lib/stratagem/interface/public/stylesheets/stratagem_debug.css", "lib/stratagem/interface/views/debug.haml", "lib/stratagem/interface/views/index.haml", "lib/stratagem/labs/auto_mock.rb", "lib/stratagem/labs/crawler.rb", "lib/stratagem/logger.rb", "lib/stratagem/model.rb", "lib/stratagem/model/application.rb", "lib/stratagem/model/components/base.rb", "lib/stratagem/model/components/controller.rb", "lib/stratagem/model/components/model.rb", "lib/stratagem/model/components/reference.rb", "lib/stratagem/model/components/route.rb", "lib/stratagem/model/components/static_file.rb", "lib/stratagem/model/components/view.rb", "lib/stratagem/model/parse_util.rb", "lib/stratagem/model_builder.rb", "lib/stratagem/recipes/deploy.rb", "lib/stratagem/scan.rb", "lib/stratagem/scan/checks/capistrano/secure_deploy.rb", "lib/stratagem/scan/checks/email_address.rb", "lib/stratagem/scan/checks/error_pages.rb", "lib/stratagem/scan/result.rb", "lib/stratagem/scanner.rb", "lib/stratagem/site_crawler.rb", "lib/stratagem/snapshot.rb", "templates/install/environments/stratagem.rb.erb", "templates/install/tasks/stratagem.rake", "stratagem.gemspec"]
16
16
  s.homepage = %q{http://github.com/stratagem/stratagem}
17
17
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Stratagem"]
18
18
  s.require_paths = ["lib"]
@@ -8,7 +8,7 @@ namespace :stratagem do
8
8
  ENV['RAILS_ENV'] = 'stratagem'
9
9
  RAILS_ENV = ENV['RAILS_ENV']
10
10
  end
11
- require 'config/environment'
11
+ require './config/environment'
12
12
 
13
13
  raise "Unable to set the Rails environment" unless Rails.env == 'stratagem'
14
14
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 9
9
- version: 0.1.9
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Charles Grimes
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-30 00:00:00 -06:00
17
+ date: 2010-10-06 00:00:00 -06:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -203,6 +203,7 @@ extra_rdoc_files:
203
203
  - lib/stratagem/extensions/class.rb
204
204
  - lib/stratagem/extensions/hash.rb
205
205
  - lib/stratagem/extensions/module.rb
206
+ - lib/stratagem/extensions/net.rb
206
207
  - lib/stratagem/extensions/object.rb
207
208
  - lib/stratagem/extensions/red_parse.rb
208
209
  - lib/stratagem/extensions/string.rb
@@ -210,10 +211,10 @@ extra_rdoc_files:
210
211
  - lib/stratagem/framework_extensions.rb
211
212
  - lib/stratagem/framework_extensions/method_invocation.rb
212
213
  - lib/stratagem/framework_extensions/models.rb
213
- - lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb
214
- - lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb
215
- - lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb
216
- - lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb
214
+ - lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb
215
+ - lib/stratagem/framework_extensions/models/adapters/active_record/extensions.rb
216
+ - lib/stratagem/framework_extensions/models/adapters/active_record/metadata.rb
217
+ - lib/stratagem/framework_extensions/models/adapters/active_record/tracing.rb
217
218
  - lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb
218
219
  - lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb
219
220
  - lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb
@@ -222,6 +223,10 @@ extra_rdoc_files:
222
223
  - lib/stratagem/framework_extensions/models/adapters/common/extensions.rb
223
224
  - lib/stratagem/framework_extensions/models/adapters/common/metadata.rb
224
225
  - lib/stratagem/framework_extensions/models/adapters/common/tracing.rb
226
+ - lib/stratagem/framework_extensions/models/adapters/devise/detect.rb
227
+ - lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb
228
+ - lib/stratagem/framework_extensions/models/adapters/devise/metadata.rb
229
+ - lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb
225
230
  - lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb
226
231
  - lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb
227
232
  - lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb
@@ -240,6 +245,7 @@ extra_rdoc_files:
240
245
  - lib/stratagem/framework_extensions/rails2/action_controller.rb
241
246
  - lib/stratagem/framework_extensions/rails2/action_mailer.rb
242
247
  - lib/stratagem/framework_extensions/rails3/parameters.rb
248
+ - lib/stratagem/framework_extensions/request_forgery_protection.rb
243
249
  - lib/stratagem/interface/browser.rb
244
250
  - lib/stratagem/interface/public/images/backgrounds/content.png
245
251
  - lib/stratagem/interface/public/images/backgrounds/shadow.png
@@ -311,6 +317,7 @@ files:
311
317
  - lib/stratagem/extensions/class.rb
312
318
  - lib/stratagem/extensions/hash.rb
313
319
  - lib/stratagem/extensions/module.rb
320
+ - lib/stratagem/extensions/net.rb
314
321
  - lib/stratagem/extensions/object.rb
315
322
  - lib/stratagem/extensions/red_parse.rb
316
323
  - lib/stratagem/extensions/string.rb
@@ -318,10 +325,10 @@ files:
318
325
  - lib/stratagem/framework_extensions.rb
319
326
  - lib/stratagem/framework_extensions/method_invocation.rb
320
327
  - lib/stratagem/framework_extensions/models.rb
321
- - lib/stratagem/framework_extensions/models/adapters/active_model/detect.rb
322
- - lib/stratagem/framework_extensions/models/adapters/active_model/extensions.rb
323
- - lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb
324
- - lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb
328
+ - lib/stratagem/framework_extensions/models/adapters/active_record/detect.rb
329
+ - lib/stratagem/framework_extensions/models/adapters/active_record/extensions.rb
330
+ - lib/stratagem/framework_extensions/models/adapters/active_record/metadata.rb
331
+ - lib/stratagem/framework_extensions/models/adapters/active_record/tracing.rb
325
332
  - lib/stratagem/framework_extensions/models/adapters/authlogic/detect.rb
326
333
  - lib/stratagem/framework_extensions/models/adapters/authlogic/extensions.rb
327
334
  - lib/stratagem/framework_extensions/models/adapters/authlogic/metadata.rb
@@ -330,6 +337,10 @@ files:
330
337
  - lib/stratagem/framework_extensions/models/adapters/common/extensions.rb
331
338
  - lib/stratagem/framework_extensions/models/adapters/common/metadata.rb
332
339
  - lib/stratagem/framework_extensions/models/adapters/common/tracing.rb
340
+ - lib/stratagem/framework_extensions/models/adapters/devise/detect.rb
341
+ - lib/stratagem/framework_extensions/models/adapters/devise/extensions.rb
342
+ - lib/stratagem/framework_extensions/models/adapters/devise/metadata.rb
343
+ - lib/stratagem/framework_extensions/models/adapters/devise/tracing.rb
333
344
  - lib/stratagem/framework_extensions/models/adapters/friendly_id/detect.rb
334
345
  - lib/stratagem/framework_extensions/models/adapters/friendly_id/extensions.rb
335
346
  - lib/stratagem/framework_extensions/models/adapters/friendly_id/metadata.rb
@@ -348,6 +359,7 @@ files:
348
359
  - lib/stratagem/framework_extensions/rails2/action_controller.rb
349
360
  - lib/stratagem/framework_extensions/rails2/action_mailer.rb
350
361
  - lib/stratagem/framework_extensions/rails3/parameters.rb
362
+ - lib/stratagem/framework_extensions/request_forgery_protection.rb
351
363
  - lib/stratagem/interface/browser.rb
352
364
  - lib/stratagem/interface/public/images/backgrounds/content.png
353
365
  - lib/stratagem/interface/public/images/backgrounds/shadow.png