stratagem 0.1.7 → 0.1.8

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 (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
+