stratagem 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/Manifest +16 -4
  2. data/Rakefile +2 -2
  3. data/lib/bootstrap.rb +1 -0
  4. data/lib/stratagem/auto_mock/aquifer.rb +15 -7
  5. data/lib/stratagem/auto_mock/factory.rb +12 -2
  6. data/lib/stratagem/auto_mock/value_generator.rb +1 -1
  7. data/lib/stratagem/commands.rb +0 -1
  8. data/lib/stratagem/crawler/authentication.rb +116 -54
  9. data/lib/stratagem/crawler/form.rb +12 -0
  10. data/lib/stratagem/crawler/html_utils.rb +19 -7
  11. data/lib/stratagem/crawler/session.rb +156 -68
  12. data/lib/stratagem/crawler/site_model.rb +21 -7
  13. data/lib/stratagem/crawler/trace_utils.rb +3 -1
  14. data/lib/stratagem/extensions/trace_compression.rb +52 -0
  15. data/lib/stratagem/extensions.rb +1 -0
  16. data/lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb +3 -8
  17. data/lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb +21 -2
  18. data/lib/stratagem/framework_extensions/models/adapters/common/detect.rb +7 -0
  19. data/lib/stratagem/framework_extensions/models/adapters/common/extensions.rb +0 -0
  20. data/lib/stratagem/framework_extensions/models/adapters/common/metadata.rb +36 -0
  21. data/lib/stratagem/framework_extensions/models/adapters/common/tracing.rb +4 -0
  22. data/lib/stratagem/framework_extensions/models/adapters/{common → util}/authentication_metadata.rb +0 -0
  23. data/lib/stratagem/framework_extensions/models/annotations.rb +23 -1
  24. data/lib/stratagem/framework_extensions/models/metadata.rb +3 -3
  25. data/lib/stratagem/framework_extensions/models/tracing.rb +32 -10
  26. data/lib/stratagem/framework_extensions/models.rb +2 -2
  27. data/lib/stratagem/model/application.rb +8 -4
  28. data/lib/stratagem/model/components/base.rb +3 -0
  29. data/lib/stratagem/model/components/controller.rb +22 -23
  30. data/lib/stratagem/model/components/model.rb +3 -2
  31. data/lib/stratagem/model/components/reference.rb +24 -13
  32. data/lib/stratagem/model/components/route.rb +0 -3
  33. data/lib/stratagem/model/components/view.rb +1 -0
  34. data/lib/stratagem/model_builder.rb +9 -11
  35. data/lib/stratagem/site_crawler.rb +14 -19
  36. data/lib/stratagem.rb +1 -1
  37. data/spec/model/component_spec.rb +43 -0
  38. data/spec/model/components/view_spec.rb +43 -0
  39. data/spec/model/test_spec.rb +10 -0
  40. data/spec/samples/404.html.erb +30 -0
  41. data/spec/samples/_form.html.erb +8 -0
  42. data/spec/samples/index.html.erb +77 -0
  43. data/spec/samples/sample_model.rb +5 -0
  44. data/spec/samples/signup.html.erb +14 -0
  45. data/spec/scan/checks/email_address_spec.rb +24 -0
  46. data/spec/scan/checks/error_pages_spec.rb +22 -0
  47. data/stratagem.gemspec +7 -4
  48. metadata +50 -21
  49. data/lib/stratagem/commands/devel_crawl.rb +0 -27
  50. data/lib/stratagem/scan/checks/ssl/secure_login_page.rb +0 -19
  51. data/lib/stratagem/scan/checks/ssl/secure_login_submit.rb +0 -18
@@ -3,6 +3,10 @@ module Stratagem::ApplicationExtensions::Models
3
3
 
4
4
  @@invocations_audit = []
5
5
 
6
+ def self.invocations_audit
7
+ @@invocations_audit
8
+ end
9
+
6
10
  def invocations_audit
7
11
  @@invocations_audit
8
12
  end
@@ -28,26 +32,44 @@ module Stratagem::ApplicationExtensions::Models
28
32
  invocations_audit.clear
29
33
  end
30
34
 
31
- def write_invocation(model_instance, method, args)
32
- invocation(method, args, write_invocations, model_instance)
35
+ def write_invocation(object, model, method, args)
36
+ invocation(method, args, write_invocations, :write, object, model)
33
37
  end
34
38
 
35
39
  def read_invocation(method, *args)
36
40
  # ensure that the read did not stem from a write operation
37
- path,action,line = controller_trace(/active_record\/base\.rb/)
38
- invocation(method, args, read_invocations) unless (action =~ /create/) || (action =~ /update/) || (action =~ /save/)
41
+ path,action,line,trace,index = controller_trace(/active_record\/base\.rb/)
42
+ invocation(method, args, read_invocations, :read) unless (action =~ /create/) || (action =~ /update/) || (action =~ /save/)
39
43
  end
40
44
 
41
- def invocation(method, args, enumeration, model_instance=nil)
42
- path,action,line = controller_trace
45
+ def invocation(method, args, enumeration, type, object=nil, alternate_model=nil)
46
+ path,action,line,trace,index = controller_trace
43
47
  args = args.first if args && (args.size == 1) && (args.first.kind_of?(Array))
44
- add_invocation enumeration, MethodInvocation.new(method, path, action, line, model_instance, model, caller, args) if (path)
48
+ add_invocation enumeration, MethodInvocation.new(method, path, action, line, object, alternate_model || model, caller, args, type) if (path)
45
49
  end
46
50
 
47
51
  def controller_trace(regex = /_controller\.rb/)
48
- controller_trace = caller.select {|c| c =~ regex }.last
49
- if controller_trace
50
- path,line,action = controller_trace.split(':')
52
+ trace_index = nil
53
+ trace_line = nil
54
+ caller.reverse.each_with_index do |line,i|
55
+ if (line =~ regex)
56
+ trace_index = i
57
+ trace_line = line
58
+ break
59
+ end
60
+ end
61
+
62
+ if trace_line
63
+ path,action,line = parse_trace_line(trace_line)
64
+ [path,action,line,caller,trace_index]
65
+ else
66
+ []
67
+ end
68
+ end
69
+
70
+ def parse_trace_line(trace_line)
71
+ path,line,action = trace_line.split(':')
72
+ if (action)
51
73
  action.gsub!(/[`']/, '').gsub!('in ', '')
52
74
  line = line.to_i
53
75
  [path,action,line]
@@ -7,13 +7,13 @@ require 'stratagem/framework_extensions/models/tracing'
7
7
  require 'stratagem/framework_extensions/models/annotations'
8
8
  require 'stratagem/framework_extensions/models/detect'
9
9
 
10
- base = File.join(File.dirname(__FILE__), 'models', 'adapters', 'common')
10
+ base = File.join(File.dirname(__FILE__), 'models', 'adapters', 'util')
11
11
  Dir.entries(base).select {|s| s =~ /\.rb$/}.each {|helper|
12
12
  require File.join(base, helper.gsub(/\.rb/, ''))
13
13
  }
14
14
 
15
15
  base = File.join(File.dirname(__FILE__), 'models', 'adapters')
16
- Dir.entries(base).select {|s| s !~ /^\./ && s != 'common' }.each {|adapter_dir|
16
+ Dir.entries(base).select {|s| s !~ /^\./ && s != 'util' }.each {|adapter_dir|
17
17
  require File.join(base, adapter_dir, 'detect')
18
18
  require File.join(base, adapter_dir, 'tracing')
19
19
  require File.join(base, adapter_dir, 'metadata')
@@ -31,8 +31,7 @@ module Stratagem::Model
31
31
 
32
32
  def export
33
33
  puts "exporting site model"
34
- p crawler.export
35
- puts "done."
34
+ references = @controllers.map {|c| c.references }.flatten.map {|r| r.export }.uniq
36
35
  h = {
37
36
  :rails_version => rails_version,
38
37
  :models => @models.export,
@@ -41,9 +40,10 @@ module Stratagem::Model
41
40
  :views => @views.export,
42
41
  :gems => @gems.export,
43
42
  :plugins => @plugins.export,
44
- :site_model => crawler.export,
45
- :references => []
43
+ :site_model => crawler ? crawler.export : nil,
44
+ :references => references
46
45
  }
46
+ p h
47
47
  h
48
48
  end
49
49
 
@@ -114,6 +114,10 @@ module Stratagem::Model
114
114
  @components.each {|e| yield e }
115
115
  end
116
116
 
117
+ def map
118
+ @components.map {|e| yield e }
119
+ end
120
+
117
121
  def << (component)
118
122
  if (component.kind_of?(Array))
119
123
  component.each {|e|
@@ -30,11 +30,14 @@ module Stratagem::Model::Component
30
30
  source = File.read(path)
31
31
  begin
32
32
  parse_tree = RedParse.new(source).parse
33
+ puts "parsed.."
33
34
  Stratagem::Model::ParseUtil.find_classes(parse_tree).map {|klass|
34
35
  self.new(path, parse_tree, klass)
35
36
  }
36
37
  rescue
38
+ puts "error loading #{path}"
37
39
  puts $!.message
40
+ puts $!.backtrace
38
41
  logger.fatal "Unable to load parse tree for #{path}"
39
42
  []
40
43
  end
@@ -2,26 +2,19 @@ require 'set'
2
2
 
3
3
  module Stratagem::Model::Component
4
4
  class Action
5
+ attr_reader :name, :controller
6
+
5
7
  def initialize(controller, name, method)
8
+ @controller = controller
6
9
  @name = name
7
10
  @method = method # :put, :get, :post, :delete
8
11
  @models_rendered = {} # model => [MethodInvocation]
9
12
  end
10
13
 
11
- def models_read
12
- models(ActiveRecord::Base.stratagem.read_invocations)
13
- end
14
-
15
- def models_modified
16
- models(ActiveRecord::Base.stratagem.write_invocations)
17
- end
18
-
19
- def models(invocations)
20
- invocations.values.select {|invocation|
14
+ def model_invocations
15
+ Stratagem::ApplicationExtensions::Models::Tracing.invocations_audit.select {|invocation|
21
16
  (invocation.controller_path == controller.path) &&
22
- (invocation.controller_action == self.name)
23
- }.map {|invocation|
24
- invocation.model_class
17
+ (invocation.controller_action.to_s == self.name.to_s)
25
18
  }.uniq
26
19
  end
27
20
 
@@ -103,16 +96,22 @@ module Stratagem::Model::Component
103
96
  []
104
97
  end
105
98
 
106
- private
107
-
108
- def create_reference(node, method, model)
109
- Reference.new(
110
- :from_class => self.klass,
111
- :to_class => model.klass,
112
- :method => method,
113
- :line_number => node.linerange.first,
114
- :reference_type => :write
115
- )
99
+ def references
100
+ actions.map {|action|
101
+ action.model_invocations.map {|inv| inv.to_reference }
102
+ }.flatten
116
103
  end
104
+
105
+ private
106
+
107
+ # def create_reference(node, method, model)
108
+ # Reference.new(
109
+ # :from_class => self.klass,
110
+ # :to_class => model.klass,
111
+ # :method => method,
112
+ # :line_number => node.linerange.first,
113
+ # :reference_type => :write
114
+ # )
115
+ # end
117
116
  end
118
117
  end
@@ -130,6 +130,7 @@ module Stratagem::Model::Component
130
130
  def export
131
131
  adapters = stratagem? ? klass.stratagem.callbacks.map {|c| c.class.name } : []
132
132
  {
133
+ :external_id => self.object_id,
133
134
  :type => :model,
134
135
  :path => @path.gsub(RAILS_ROOT+'/', ''),
135
136
  :class_name => @klass.name,
@@ -143,7 +144,6 @@ module Stratagem::Model::Component
143
144
  :whitelists_attributes => stratagem? ? @klass.stratagem.whitelists_attributes? : nil,
144
145
  :blacklists_attributes => stratagem? ? @klass.stratagem.blacklists_attributes? : nil,
145
146
  :instance_methods => @model_instance_methods,
146
- :referenced_by => @model_referenced_by.map {|r| r.export },
147
147
  :relations => relations.map {|r| r.export },
148
148
  :adapters => adapters
149
149
  }
@@ -154,7 +154,8 @@ module Stratagem::Model::Component
154
154
  def relations
155
155
  if (stratagem?)
156
156
  @relations ||= klass.stratagem.relations.map {|relation|
157
- Reference.new(:reference_type => relation.macro, :from_class => self.klass, :to_class => relation.klass)
157
+ to = app_model.models.find {|m| m.klass == relation.klass }
158
+ Reference.new(:reference_type => relation.macro, :from_component => self, :to_component => to, :options => relation.options)
158
159
  }
159
160
  else
160
161
  []
@@ -1,30 +1,41 @@
1
1
  module Stratagem::Model::Component
2
2
  class Reference
3
3
  attr_accessor :reference_type # :read, :write
4
- attr_accessor :from_class, :to_class
5
- attr_accessor :line_number
6
- attr_accessor :method
4
+ attr_accessor :from_component, :to_component
5
+ attr_accessor :line_number, :method, :function, :options, :stack_trace
7
6
 
8
- Vars = [:reference_type, :from_class, :to_class, :line_number, :method]
7
+ Vars = [:reference_type, :from_component, :to_component, :line_number, :method, :function, :options, :stack_trace]
9
8
 
10
9
  def initialize(args={})
11
10
  args.each {|key,val| self.send("#{key}=", val) }
12
11
  end
13
12
 
14
13
  def ==(other)
15
- Vars.each do |attribute|
16
- self.send(attribute) == other.send(attribute)
17
- end
14
+ Vars.find {|attribute|
15
+ self.send(attribute) != other.send(attribute)
16
+ }.nil?
18
17
  end
19
18
 
20
19
  def export
21
- h = {}
22
- Vars.each do |key|
23
- h[key.to_s] = self.send(key).to_s
20
+ h = {
21
+ :external_id => self.object_id,
22
+ :reference_type => reference_type,
23
+ :from_component_external_id => from_component.object_id,
24
+ :to_component_external_id => to_component.object_id,
25
+ :line_number => line_number,
26
+ :method => method,
27
+ :function => function,
28
+ :options => options ? options.to_json : nil,
29
+ :stack_trace => reference_type == :write ? compressed_stack_trace : nil
30
+ }
31
+ end
32
+
33
+ def compressed_stack_trace
34
+ if (stack_trace)
35
+ TraceDeflator.deflate(stack_trace)
36
+ else
37
+ nil
24
38
  end
25
- h[:from_class.to_s] = from_class.name
26
- h[:to_class.to_s] = to_class.name
27
- h
28
39
  end
29
40
  end
30
41
  end
@@ -36,9 +36,6 @@ module Stratagem::Model::Component
36
36
  end
37
37
 
38
38
  def export
39
- p @route.requirements
40
- p action
41
- puts "--"
42
39
  {
43
40
  :external_id => self.object_id,
44
41
  :type => :route,
@@ -32,6 +32,7 @@ module Stratagem::Model::Component
32
32
  def export
33
33
  begin
34
34
  {
35
+ :external_id => self.object_id,
35
36
  :type => :view,
36
37
  :path => @path,
37
38
  :render_path => @render_path,
@@ -1,10 +1,9 @@
1
1
  module Stratagem
2
2
  class ModelBuilder
3
- attr_reader :parsed_models, :parsed_controllers, :aquifer
3
+ attr_reader :parsed_models, :parsed_controllers
4
4
 
5
5
  def initialize
6
6
  @model = Stratagem::Model::Application.instance
7
- @aquifer = Stratagem::AutoMock::Aquifer.init(@model)
8
7
  end
9
8
 
10
9
  def run
@@ -16,7 +15,6 @@ module Stratagem
16
15
 
17
16
  print_errors
18
17
 
19
- @aquifer.fill
20
18
  @model
21
19
  end
22
20
 
@@ -49,12 +47,12 @@ module Stratagem
49
47
  models.each do |c|
50
48
  log "\t#{c.klass.name} loaded from #{model}"
51
49
 
52
- references = []
53
- @model.controllers.each do |controller|
54
- references += controller.modifies(c)
55
- end
56
- log "\t\t#{references.size} references from controllers"
57
- c.model_referenced_by = references
50
+ # references = []
51
+ # @model.controllers.each do |controller|
52
+ # references += controller.modifies(c)
53
+ # end
54
+ # log "\t\t#{references.size} references from controllers"
55
+ # c.model_referenced_by = references
58
56
  end
59
57
  @model.models << models
60
58
  }
@@ -101,9 +99,9 @@ module Stratagem
101
99
  controller_name << 'Controller'
102
100
  controller_class = controllers.find {|controller| controller.klass.name == controller_name }
103
101
  controller_object = controller_class ? controller_class.klass.new : nil
104
- controller_action = route.parameter_shell[:action].to_sym
102
+ controller_action = route.parameter_shell[:action] ? route.parameter_shell[:action].to_sym : nil
105
103
 
106
- if (controller_object) && (controller_object.methods_include?(controller_action))
104
+ if (controller_object && controller_action) && (controller_object.methods_include?(controller_action))
107
105
  controllers.each do |controller|
108
106
  controller.add_routable_action(controller_action, route.conditions[:method] || :get)
109
107
  end
@@ -9,35 +9,30 @@ module Stratagem
9
9
  def run
10
10
  crawler_session(@application_model) do
11
11
  log "crawling site"
12
- phase(:unauthenticated)
13
- crawl
14
- display
15
- authenticated = authenticate
16
-
17
- if (authenticated)
18
- phase(:authenticated)
12
+ page_set(:unauthenticated) do |pages|
13
+ puts "SET: #{pages.object_id}"
19
14
  crawl
20
15
  display
21
16
  end
17
+
18
+ users.each do |user|
19
+ page_set("user_#{user.id}") do |pages|
20
+ authenticate(user) do
21
+ puts "authenticated with #{user.stratagem.mock_attributes.inspect}"
22
+ crawl
23
+ crawl(:put)
24
+ end
25
+ end
26
+ end
27
+
22
28
  end
23
29
 
24
30
  self
25
31
  end
26
32
 
27
33
  def export
28
- phases = site_models.map {|phase,model|
29
- h = model.export
30
- h[:name] = phase
31
- h
32
- }
33
34
  {
34
- :authentication => {
35
- :success => authentication.success,
36
- :login_page_external_id => authentication.login_page.object_id,
37
- :response_page_external_id => authentication.response_page.object_id,
38
- :ssl => authentication.ssl
39
- },
40
- :phases => phases
35
+ :page_sets => site_models.map {|site_model| site_model.export }
41
36
  }
42
37
  end
43
38
 
data/lib/stratagem.rb CHANGED
@@ -2,7 +2,7 @@ class StratagemError < RuntimeError
2
2
  attr_accessor :target
3
3
 
4
4
  def initialize(*args)
5
- super(*args)
5
+ super(args.first)
6
6
  (@@all ||= []) << self
7
7
  end
8
8
  end
@@ -0,0 +1,43 @@
1
+ require 'spec/spec_helper'
2
+ require 'lib/security'
3
+
4
+ module Security
5
+ module Model
6
+ module Component
7
+ class View
8
+ def full_path
9
+ File.join(RAILS_ROOT, 'spec', 'samples', @render_path+"."+@extension)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+
17
+ describe Security::Model::Component::Model do
18
+ before do
19
+ path = File.join(RAILS_ROOT, 'spec', 'samples', 'sample_model.rb')
20
+ models = Security::::Model::Component::Model.load_all(path)
21
+ @model = models.first
22
+ end
23
+
24
+ it "should not error on serialize" do
25
+ lambda { @model.export.to_json }.should_not raise_exception
26
+ end
27
+
28
+ it "should export a hash" do
29
+ @model.export.should be_kind_of(Hash)
30
+ end
31
+ end
32
+
33
+ describe Security::::Model::Component::View do
34
+ before do
35
+ @view = Security::::Model::Component::View.new('index.html.erb')
36
+ @template = @view.read
37
+ end
38
+
39
+ it "should read the template from disk" do
40
+ @template.should_not be_nil
41
+ @template.size.should > 0
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec/spec_helper'
2
+ require 'lib/security'
3
+
4
+ describe Security::Model::Component::View do
5
+ before do
6
+ @view = Security::Model::Component::View.new('signup.html.erb')
7
+ @template = @view.read
8
+ end
9
+
10
+ describe :file_system_pointers do
11
+ it "should give the correct full path" do
12
+ File.exists?(@view.full_path).should be_true
13
+ end
14
+
15
+ it "should give the correct directory" do
16
+ @view.directory.should eql(File.join(RAILS_ROOT, 'spec', 'samples'))
17
+ end
18
+ end
19
+
20
+ describe :loading do
21
+ it "should read the template from disk" do
22
+ @template.should_not be_nil
23
+ @template.size.should > 0
24
+ end
25
+ end
26
+
27
+ describe :html_extraction do
28
+ it "should identify the models that the forms are talking about" do
29
+ @view.forms.first.model.should eql(User)
30
+ end
31
+
32
+ it "should have 2 forms" do
33
+ @view.forms.each {|f| p f.export }
34
+ @view.forms.size.should eql(2)
35
+ end
36
+
37
+ it "should have 3 fields in each form" do
38
+ @view.forms.each {|form|
39
+ form.fields.size.should eql(3)
40
+ }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec/spec_helper'
2
+ require 'lib/security'
3
+
4
+ describe Object do
5
+ it "should test" do
6
+ source = File.open(File.join(RAILS_ROOT, "spec","samples","sample_model.rb")).readlines.join("\n")
7
+ tree = RedParse.new(source).parse
8
+ p tree.first.linerange.first
9
+ end
10
+ end
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+
6
+ <head>
7
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
+ <title>The page you were looking for doesn't exist (404)</title>
9
+ <style type="text/css">
10
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
+ div.dialog {
12
+ width: 25em;
13
+ padding: 0 4em;
14
+ margin: 4em auto 0 auto;
15
+ border: 1px solid #ccc;
16
+ border-right-color: #999;
17
+ border-bottom-color: #999;
18
+ }
19
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
+ </style>
21
+ </head>
22
+
23
+ <body>
24
+ <!-- This file lives in public/404.html -->
25
+ <div class="dialog">
26
+ <h1>The page you were looking for doesn't exist.</h1>
27
+ <p>You may have mistyped the address or the page may have moved.</p>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,8 @@
1
+ <%= form.label :login %><br />
2
+ <%= form.text_field :login %><br />
3
+ <br />
4
+ <%= form.label :password, form.object.new_record? ? nil : "Change password" %><br />
5
+ <%= form.password_field :password %><br />
6
+ <br />
7
+ <%= form.label :password_confirmation %><br />
8
+ <%= form.password_field :password_confirmation %><br />
@@ -0,0 +1,77 @@
1
+ <div class="contact">email1@clearnetsec.com</div>
2
+ <div class="contact">&email2@clearnetsec.com-</div>
3
+
4
+ <strong>About</strong>
5
+ <p>
6
+ We are a team of security engineers, software developers and machine learning experts with a unique perspective on security.
7
+ ClearNet Security is a security services and development firm offering penetration testing, vulnerability assessments, and software development expertise since 2004.
8
+ </p>
9
+
10
+ <br />
11
+
12
+ <strong>
13
+ Expertise for less
14
+ </strong>
15
+ <p>
16
+ We accept direct work and project based work from partner companies. Our direct à la carte rate is $135 per hour.
17
+ </p>
18
+ </div>
19
+
20
+ <div class="profiles">
21
+
22
+ <h1>ClearNet Security Principals</h1>
23
+
24
+ <ul id="profiles">
25
+ <li>
26
+ <%= image_tag 'photos/tate.png', :class => 'profile' %>
27
+ <h3>Tate Hansen, Owner, Principal</h3>
28
+ <p>
29
+ Tate has 15+ years of engineering experience. He has specialized in security, including security
30
+ product development, security assessments, penetration testing, and building defensively strong
31
+ systems. Prior to ClearNet Security, Tate worked as a security engineer on both the
32
+ Intrusion Detection and Vulnerability Assessment product teams at StillSecure, did a stint at Sun
33
+ Microsystems where he solved critical networking problems for Sun’s customers, and was a
34
+ member of Sun’s CCC Security Team. Tate has performed well over 100 security assessments
35
+ and is ClearNet Security’s PCI DSS engineer.
36
+ </p>
37
+ <p>
38
+ <%= link_to image_tag("icons/linkedin_s.png"), "http://www.linkedin.com/in/tatehansen", :target => '_blank', :rel => 'nofollow', :class => :facebook %>
39
+ <%= link_to image_tag("icons/twitter_s.png"), "http://www.twitter.com/tatehansen", :target => '_blank', :rel => 'nofollow', :class => :twitter %>
40
+ <%= link_to image_tag("icons/blog_s.png"), "http://blog.clearnetsec.com", :target => '_blank', :rel => 'nofollow', :class => :blog %>
41
+ </p>
42
+ <div class="cf"></div>
43
+ </li>
44
+ <li>
45
+ <%= image_tag 'photos/cj.png', :class => 'profile' %>
46
+ <h3>Charles Grimes II, Owner, Principal</h3>
47
+ <p>
48
+ Charles has 12+ years of software design and engineering experience. He has a
49
+ proven track record of successfully bringing new products and intellectual property to market.
50
+ His teams have produced new data analysis technologies for Social Media, Business Activity
51
+ Monitoring, Business Process Monitoring, Log Analysis and Security Information and Event
52
+ Management. He has patented work in the area of adaptive, distributed data collection.
53
+ Charles is ClearNet Security's principal technologist.
54
+ <p>
55
+ <%= link_to image_tag("icons/linkedin_s.png"), "http://www.linkedin.com/in/charlesgrimes", :target => '_blank', :rel => 'nofollow', :class => :facebook %>
56
+ <%= link_to image_tag("icons/twitter_s.png"), "http://www.twitter.com/cj2", :target => '_blank', :rel => 'nofollow', :class => :twitter %>
57
+ </p>
58
+ <div class="cf"></div>
59
+ </li>
60
+ </ul>
61
+
62
+ <div class="cf"></div>
63
+
64
+ <br />
65
+
66
+ <h1>Our Team of Specialists</h1>
67
+ <p>
68
+ We have a great network of security and software specialist. We frequently pull in specialist to provide
69
+ specific expertise for the job at hand. Our network includes team leaders of commercial intrusion detection
70
+ products and commercial vulnerability assessment products. We work with AI (artificial intelligence) and
71
+ machine learning experts and engineers with strong mathematics and cryptography experience. Our software
72
+ expertise covers Java, .NET, Ruby, Ruby on Rails, C, C++.
73
+ </p>
74
+ <div class="cf">email1@clearnetsec.com&nbsp;</div>
75
+ </div>
76
+ <br />
77
+ <div class="cf">&nbsp;</div>
@@ -0,0 +1,5 @@
1
+ class SampleModel
2
+ def show
3
+ puts "hi"
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ <h1>Register</h1>
2
+
3
+ <% form_for @user, :url => account_path do |f| %>
4
+ <%= f.error_messages %>
5
+ <%= render :partial => "form", :object => f, :locals => {:a => 'a'} %>
6
+ <%= f.submit "Register" %>
7
+ <% end %>
8
+
9
+ <% form_for @user, :url => account_path do |f| %>
10
+ <%= f.error_messages %>
11
+ <%= render :partial => "form", :object => f %>
12
+ <%= f.submit "Register" %>
13
+ <% end %>
14
+