controls 1.0.0.beta.2
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/LICENSE.md +20 -0
- data/README.md +78 -0
- data/Rakefile +3 -0
- data/controls.gemspec +30 -0
- data/docs/images/controlsinsight+shield.png +0 -0
- data/docs/images/controlsinsight.png +0 -0
- data/lib/controls.rb +42 -0
- data/lib/controls/authentication.rb +46 -0
- data/lib/controls/client.rb +151 -0
- data/lib/controls/client/assessments.rb +17 -0
- data/lib/controls/client/assets.rb +64 -0
- data/lib/controls/client/configurations.rb +31 -0
- data/lib/controls/client/guidance.rb +46 -0
- data/lib/controls/client/prioritized_guidance.rb +34 -0
- data/lib/controls/client/security_controls.rb +36 -0
- data/lib/controls/client/threat_vectors.rb +29 -0
- data/lib/controls/client/threats.rb +26 -0
- data/lib/controls/configurable.rb +83 -0
- data/lib/controls/default.rb +108 -0
- data/lib/controls/error.rb +132 -0
- data/lib/controls/response.rb +76 -0
- data/lib/controls/response/raise_error.rb +21 -0
- data/lib/controls/version.rb +4 -0
- data/spec/controls_spec.rb +22 -0
- data/spec/helper.rb +42 -0
- metadata +187 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
|
+
require 'active_support/core_ext/hash/keys'
|
3
|
+
require 'controls/response/raise_error'
|
4
|
+
|
5
|
+
module Controls
|
6
|
+
# A namespace for response related classes
|
7
|
+
module Response
|
8
|
+
# @param [String] response the response body as a JSON String provided by
|
9
|
+
# the ControlsInsight API
|
10
|
+
# @return [Array,Hash] the response after being parsed into an Array or
|
11
|
+
# Hash
|
12
|
+
def self.parse(response)
|
13
|
+
response = JSON.parse(response)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [Array,Hash] response the Array or Hash to convert into a ruby
|
17
|
+
# style object
|
18
|
+
def self.generate_ruby(response)
|
19
|
+
if response.is_a? String
|
20
|
+
response = JSON.parse(response)
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO: Determine the specific format, or create a new, recursive (w/
|
24
|
+
# array support) deep method
|
25
|
+
# NOTE: If the ControlsInsight API begins returning more complex JSON
|
26
|
+
# this conditional must be updated.
|
27
|
+
if response.is_a? Hash
|
28
|
+
response.deep_transform_keys! { |key| key.underscore }
|
29
|
+
|
30
|
+
if response.has_key? 'resources'
|
31
|
+
response['resources'].each do |hash|
|
32
|
+
hash.deep_transform_keys! { |key| key.underscore }
|
33
|
+
|
34
|
+
if hash.has_key? 'security_control_findings'
|
35
|
+
hash['security_control_findings'].each do |subhash|
|
36
|
+
subhash.deep_transform_keys! { |key| key.underscore }
|
37
|
+
|
38
|
+
if subhash.has_key? 'configuration_findings'
|
39
|
+
subhash['configuration_findings'].each do |subhash_two|
|
40
|
+
subhash_two.deep_transform_keys! { |key| key.underscore }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
elsif response.is_a? Array
|
48
|
+
response.each do |element|
|
49
|
+
if element.is_a? Hash
|
50
|
+
element.deep_transform_keys! { |key| key.underscore }
|
51
|
+
|
52
|
+
if element.has_key? 'resources'
|
53
|
+
element['resources'].each do |hash|
|
54
|
+
hash.deep_transform_keys! { |key| key.underscore }
|
55
|
+
|
56
|
+
if hash.has_key? 'security_control_findings'
|
57
|
+
hash['security_control_findings'].each do |subhash|
|
58
|
+
subhash.deep_transform_keys! { |key| key.underscore }
|
59
|
+
|
60
|
+
if subhash.has_key? 'configuration_findings'
|
61
|
+
subhash['configuration_findings'].each do |subhash_two|
|
62
|
+
subhash_two.deep_transform_keys! { |key| key.underscore }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
response
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'controls/error'
|
2
|
+
|
3
|
+
module Controls
|
4
|
+
module Response
|
5
|
+
# A middleware plugin that hooks into the Faraday client used by this gem
|
6
|
+
class RaiseError < Faraday::Response::Middleware
|
7
|
+
private
|
8
|
+
|
9
|
+
# Implements the {#on_complete} hook used by Faraday's middleware
|
10
|
+
#
|
11
|
+
# @raise [Controls::Error] a subclass of Controls::Error if any errors
|
12
|
+
# were encountered
|
13
|
+
# @return [nil] if no error was found
|
14
|
+
def on_complete(response)
|
15
|
+
if error = Controls::Error.from_response(response)
|
16
|
+
raise error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
# TODO: Add more tests
|
4
|
+
describe Controls do
|
5
|
+
before { Controls.reset! }
|
6
|
+
after { Controls.reset! }
|
7
|
+
|
8
|
+
it 'is configured with default values from the environment' do
|
9
|
+
Controls::Configurable.keys.each do |key|
|
10
|
+
actual = Controls.instance_variable_get(:"@#{key}")
|
11
|
+
expected = Controls::Default.send(key)
|
12
|
+
|
13
|
+
expect(actual).to eq(expected)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'Controls.client' do
|
18
|
+
it 'is an instance of Controls::Client' do
|
19
|
+
expect(Controls.client).to be_kind_of Controls::Client
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'controls'
|
3
|
+
|
4
|
+
require 'vcr'
|
5
|
+
VCR.configure do |vcr|
|
6
|
+
vcr.filter_sensitive_data('<CONTROLS_USERNAME>') do
|
7
|
+
ENV['CONTROLS_TEST_USERNAME'] ||= ENV['CONTROLS_TEST_USERNAME']
|
8
|
+
end
|
9
|
+
|
10
|
+
vcr.filter_sensitive_data('<CONTROLS_PASSWORD>') do
|
11
|
+
ENV['CONTROLS_TEST_PASSWORD'] ||= ENV['CONTROLS_TEST_PASSWORD']
|
12
|
+
end
|
13
|
+
|
14
|
+
vcr.filter_sensitive_data('https://nexpose.local:3780') do
|
15
|
+
uri = URI.parse(Controls.client.web_endpoint)
|
16
|
+
"#{uri.scheme}://#{uri.host}:#{uri.port}"
|
17
|
+
end
|
18
|
+
|
19
|
+
vcr.filter_sensitive_data('<CONTROLS_PASSWORD>') do
|
20
|
+
ENV['CONTROLS_TEST_PASSWORD'] ||= ENV['CONTROLS_TEST_PASSWORD']
|
21
|
+
end
|
22
|
+
|
23
|
+
vcr.default_cassette_options = {
|
24
|
+
record: ENV['CI'] ? :none : :once,
|
25
|
+
serialize_with: :json
|
26
|
+
}
|
27
|
+
|
28
|
+
vcr.cassette_library_dir = 'spec/cassettes'
|
29
|
+
vcr.hook_into :faraday
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_controls_username
|
33
|
+
ENV.fetch 'CONTROLS_TEST_USERNAME'
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_controls_password
|
37
|
+
ENV.fetch 'CONTROLS_TEST_PASSWORD'
|
38
|
+
end
|
39
|
+
|
40
|
+
def token_auth_client(user = test_controls_username, pass = test_controls_password)
|
41
|
+
Controls.client.new(username: user, password: pass)
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: controls
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.beta.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Erran Carey
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: netrc
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: vcr
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: yard
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: This gem interfaces to Rapid7's **controls**insight API.
|
126
|
+
email:
|
127
|
+
- '''me@errancarey.com'''
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- .gitignore
|
133
|
+
- .yardopts
|
134
|
+
- Gemfile
|
135
|
+
- LICENSE.md
|
136
|
+
- README.md
|
137
|
+
- Rakefile
|
138
|
+
- controls.gemspec
|
139
|
+
- docs/images/controlsinsight+shield.png
|
140
|
+
- docs/images/controlsinsight.png
|
141
|
+
- lib/controls.rb
|
142
|
+
- lib/controls/authentication.rb
|
143
|
+
- lib/controls/client.rb
|
144
|
+
- lib/controls/client/assessments.rb
|
145
|
+
- lib/controls/client/assets.rb
|
146
|
+
- lib/controls/client/configurations.rb
|
147
|
+
- lib/controls/client/guidance.rb
|
148
|
+
- lib/controls/client/prioritized_guidance.rb
|
149
|
+
- lib/controls/client/security_controls.rb
|
150
|
+
- lib/controls/client/threat_vectors.rb
|
151
|
+
- lib/controls/client/threats.rb
|
152
|
+
- lib/controls/configurable.rb
|
153
|
+
- lib/controls/default.rb
|
154
|
+
- lib/controls/error.rb
|
155
|
+
- lib/controls/response.rb
|
156
|
+
- lib/controls/response/raise_error.rb
|
157
|
+
- lib/controls/version.rb
|
158
|
+
- spec/controls_spec.rb
|
159
|
+
- spec/helper.rb
|
160
|
+
homepage: ''
|
161
|
+
licenses:
|
162
|
+
- MIT
|
163
|
+
metadata: {}
|
164
|
+
post_install_message:
|
165
|
+
rdoc_options: []
|
166
|
+
require_paths:
|
167
|
+
- lib
|
168
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - '>'
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: 1.3.1
|
178
|
+
requirements: []
|
179
|
+
rubyforge_project:
|
180
|
+
rubygems_version: 2.1.9
|
181
|
+
signing_key:
|
182
|
+
specification_version: 4
|
183
|
+
summary: This gem interfaces to Rapid7's **controls**insight API.
|
184
|
+
test_files:
|
185
|
+
- spec/controls_spec.rb
|
186
|
+
- spec/helper.rb
|
187
|
+
has_rdoc:
|