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