stratagem 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +16 -4
- data/Rakefile +2 -2
- data/lib/bootstrap.rb +1 -0
- data/lib/stratagem/auto_mock/aquifer.rb +15 -7
- data/lib/stratagem/auto_mock/factory.rb +12 -2
- data/lib/stratagem/auto_mock/value_generator.rb +1 -1
- data/lib/stratagem/commands.rb +0 -1
- data/lib/stratagem/crawler/authentication.rb +116 -54
- data/lib/stratagem/crawler/form.rb +12 -0
- data/lib/stratagem/crawler/html_utils.rb +19 -7
- data/lib/stratagem/crawler/session.rb +156 -68
- data/lib/stratagem/crawler/site_model.rb +21 -7
- data/lib/stratagem/crawler/trace_utils.rb +3 -1
- data/lib/stratagem/extensions/trace_compression.rb +52 -0
- data/lib/stratagem/extensions.rb +1 -0
- data/lib/stratagem/framework_extensions/models/adapters/active_model/metadata.rb +3 -8
- data/lib/stratagem/framework_extensions/models/adapters/active_model/tracing.rb +21 -2
- data/lib/stratagem/framework_extensions/models/adapters/common/detect.rb +7 -0
- data/lib/stratagem/framework_extensions/models/adapters/common/extensions.rb +0 -0
- data/lib/stratagem/framework_extensions/models/adapters/common/metadata.rb +36 -0
- data/lib/stratagem/framework_extensions/models/adapters/common/tracing.rb +4 -0
- data/lib/stratagem/framework_extensions/models/adapters/{common → util}/authentication_metadata.rb +0 -0
- data/lib/stratagem/framework_extensions/models/annotations.rb +23 -1
- data/lib/stratagem/framework_extensions/models/metadata.rb +3 -3
- data/lib/stratagem/framework_extensions/models/tracing.rb +32 -10
- data/lib/stratagem/framework_extensions/models.rb +2 -2
- data/lib/stratagem/model/application.rb +8 -4
- data/lib/stratagem/model/components/base.rb +3 -0
- data/lib/stratagem/model/components/controller.rb +22 -23
- data/lib/stratagem/model/components/model.rb +3 -2
- data/lib/stratagem/model/components/reference.rb +24 -13
- data/lib/stratagem/model/components/route.rb +0 -3
- data/lib/stratagem/model/components/view.rb +1 -0
- data/lib/stratagem/model_builder.rb +9 -11
- data/lib/stratagem/site_crawler.rb +14 -19
- data/lib/stratagem.rb +1 -1
- data/spec/model/component_spec.rb +43 -0
- data/spec/model/components/view_spec.rb +43 -0
- data/spec/model/test_spec.rb +10 -0
- data/spec/samples/404.html.erb +30 -0
- data/spec/samples/_form.html.erb +8 -0
- data/spec/samples/index.html.erb +77 -0
- data/spec/samples/sample_model.rb +5 -0
- data/spec/samples/signup.html.erb +14 -0
- data/spec/scan/checks/email_address_spec.rb +24 -0
- data/spec/scan/checks/error_pages_spec.rb +22 -0
- data/stratagem.gemspec +7 -4
- metadata +50 -21
- data/lib/stratagem/commands/devel_crawl.rb +0 -27
- data/lib/stratagem/scan/checks/ssl/secure_login_page.rb +0 -19
- 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(
|
32
|
-
invocation(method, args, write_invocations,
|
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,
|
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,
|
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
|
-
|
49
|
-
|
50
|
-
|
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', '
|
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 != '
|
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
|
-
|
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
|
12
|
-
|
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
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
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
|
-
|
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 :
|
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, :
|
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.
|
16
|
-
self.send(attribute)
|
17
|
-
|
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
|
-
|
23
|
-
|
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
|
@@ -1,10 +1,9 @@
|
|
1
1
|
module Stratagem
|
2
2
|
class ModelBuilder
|
3
|
-
attr_reader :parsed_models, :parsed_controllers
|
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
|
-
|
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
|
-
|
13
|
-
|
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
|
-
:
|
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
@@ -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 </div>
|
75
|
+
</div>
|
76
|
+
<br />
|
77
|
+
<div class="cf"> </div>
|
@@ -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
|
+
|