controls 1.7.4 → 1.7.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 065fa99a2640d1220a1ff42cc3e5cce250bb4b50
4
- data.tar.gz: 54b996ced517d7709a9a0462e7407bc39e31c379
3
+ metadata.gz: 6c245dec5cdf4115335c576ae0019c5f7a25835e
4
+ data.tar.gz: 38bbd0e485cc4713699eb4b6749192596b0a7f73
5
5
  SHA512:
6
- metadata.gz: 674bcfba75b727fac6740e128171ea14603855725bf1f5e7c8d3fce2abf67d3924fc54ef2e9d084e6e9d84751340e9112f13390c378ebeb1b32aab8fcaba3208
7
- data.tar.gz: d0d18bd18e12f54ab6f32cca5c8726da967d255202905e4c668080dbafca77a0d95d05de93dd8c219f7d28329f12fdb84029fbdf6c12049172e0df595ee807ab
6
+ metadata.gz: 79b1f36d95c8832c9f51fa9a6947a39d50bbf1e3fef4b4fda3c8f38988a90ede0abe35e49f1d6ce3fbe8d92df8ceb2e3bb94a4e77a0634964fa9c48a6862604c
7
+ data.tar.gz: a7534a3fccc7a0ffee58b73a510a17809afccb12c89d37b8c3e251bfb0e1efdef986d8396395203a17085a74aba6b360d3684b06ede233e4c28e69e2d4b7e18c
data/.travis.yml CHANGED
@@ -3,3 +3,6 @@ rvm:
3
3
  - 2.1.0
4
4
  env:
5
5
  - CONTROLS_API_ENDPOINT="https://controlsinsight.apiary.io/insight/controls/api"
6
+ - CONTROLS_WEB_ENDPOINT="https://controlsinsight.apiary.io/insight/controls"
7
+ - CONTROLS_USERNAME="johndoe"
8
+ - CONTROLS_PASSWORD="Password123!"
data/apiary.apib CHANGED
@@ -8,25 +8,6 @@ Notes API is a *short texts saving* service similar to its physical paper presen
8
8
  ## Assessment Collection [/assessments]
9
9
  ### Assessments [GET]
10
10
 
11
- + Response 200 (application/json)
12
-
13
- {
14
- "id": 1,
15
- "assessing": false,
16
- "highRiskAssetCount": 0,
17
- "mediumRiskAssetCount": 24,
18
- "lowRiskAssetCount": 0,
19
- "totalAssetCount": 24,
20
- "overallRiskScore": 4.004146038088617,
21
- "timestamp": 1393184605912
22
- }
23
-
24
- ## Assessment [/assessments/{assessment_id}]
25
- ### Assessment by ID [GET]
26
-
27
- + Parameters
28
- + assessment_id (optional, integer, `1`) ... The ID of the assessment to retreive.
29
-
30
11
  + Response 200 (application/json)
31
12
 
32
13
  [
@@ -42,6 +23,25 @@ Notes API is a *short texts saving* service similar to its physical paper presen
42
23
  }
43
24
  ]
44
25
 
26
+ ## Assessment [/assessments/{assessment_id}]
27
+ ### Assessment by ID [GET]
28
+
29
+ + Parameters
30
+ + assessment_id (optional, integer, `1`) ... The ID of the assessment to retreive.
31
+
32
+ + Response 200 (application/json)
33
+
34
+ {
35
+ "id": 1,
36
+ "assessing": false,
37
+ "highRiskAssetCount": 0,
38
+ "mediumRiskAssetCount": 24,
39
+ "lowRiskAssetCount": 0,
40
+ "totalAssetCount": 24,
41
+ "overallRiskScore": 4.004146038088617,
42
+ "timestamp": 1393184605912
43
+ }
44
+
45
45
  # Group Search
46
46
  ## Assets [/assets/search?query={query}]
47
47
  ### Asset Search [GET]
@@ -51,12 +51,12 @@ Notes API is a *short texts saving* service similar to its physical paper presen
51
51
 
52
52
  + Response 200 (application/json)
53
53
 
54
- [
55
- {
54
+ {
55
+ "resources": {
56
56
  "uuid": "db899a57-347c-4df9-9ce2-6932dc4adf38>",
57
57
  "riskScore": 5.554266115196547,
58
58
  "riskLevel": "MEDIUM",
59
59
  "hostName": "CMMNCTR2K7R2-U",
60
60
  "ipaddress": "10.4.19.25"
61
61
  }
62
- ]
62
+ }
@@ -121,6 +121,7 @@ module Controls
121
121
  # @return [Array,Hash] an array or hash of parsed JSON data
122
122
  def put(path, body = {}, headers = {}, &block)
123
123
  headers = connection_options[:headers].merge(headers)
124
+ headers['content-type'] = 'application/json'
124
125
  url = URI.escape(File.join(api_endpoint, path))
125
126
  resp = middleware.put(url, body, headers, &block)
126
127
  @_last_request = {
@@ -132,7 +133,7 @@ module Controls
132
133
  fail exception('Invalid content-type error')
133
134
  end
134
135
 
135
- Response.parse(resp.body, path)
136
+ resp.status
136
137
  rescue Faraday::Error::ConnectionFailed => e
137
138
  if e.message =~ /^SSL_connect/
138
139
  warn(*SSL_WARNING)
@@ -36,9 +36,10 @@ module Controls
36
36
  # @param [Array[Hash{String=>String,Boolean}]] controls a list of controls to update
37
37
  # @return [void]
38
38
  def update_security_controls(controls)
39
- # [review] - this style is a discouraged for Arrays, but we want to treat controls as an Array of Hashes
40
- if controls.is_a? Array
39
+ if controls.kind_of? Array
41
40
  put '/security_controls', controls.to_json
41
+ elsif controls.is_a? Controls::SecurityControl
42
+ put "/security_controls/#{controls.name}", controls.to_json
42
43
  elsif controls.is_a? Hash
43
44
  put "/security_controls/#{controls['name']}", controls.to_json
44
45
  end
@@ -1,4 +1,4 @@
1
1
  module Controls
2
2
  # The version of the Controls gem
3
- VERSION = '1.7.4'
3
+ VERSION = '1.7.5'
4
4
  end
@@ -1,3 +1,5 @@
1
+ require_relative '../../spec_helper'
2
+
1
3
  describe '/api/assessments' do
2
4
  before do
3
5
  login_to_environment
@@ -0,0 +1,52 @@
1
+ require_relative '../../spec_helper.rb'
2
+
3
+ describe '/api/assets' do
4
+ before do
5
+ login_to_environment
6
+ end
7
+
8
+ context 'GET /api/assets' do
9
+ it 'returns a paginated asset collection' do
10
+ assets = Controls.assets
11
+
12
+ expect(assets).to be_kind_of(Controls::AssetCollection)
13
+ end
14
+
15
+ it 'respects pageable parameters' do
16
+ asset_collection = Controls.assets(
17
+ 'page.sort' => 'os',
18
+ 'page.size' => 20,
19
+ 'page.sort.dir' => 'DESC'
20
+ )
21
+ expect(asset_collection).to be_kind_of(Controls::AssetCollection)
22
+
23
+ sort = asset_collection.sort.first
24
+ expect(sort.ascending?).to be_false
25
+ expect(sort.direction).to eq('DESC')
26
+ expect(sort.property).to eq('os')
27
+
28
+ operating_systems = asset_collection.resources.map(&:operating_system)
29
+ expect(operating_systems).to eq(operating_systems.sort.reverse)
30
+ end
31
+
32
+ it 'returns a 400 Bad Request on a bad page.sort parameter' do
33
+ asset_collection = expect {
34
+ Controls.assets(
35
+ 'page.sort' => 'asdfghjkl;'
36
+ )
37
+ }.not_to raise_error, "expected: 200 OK\ngot: 500 Internal Server Error"
38
+ expect(asset_collection).to be_kind_of(Controls::Error)
39
+ end
40
+ end
41
+
42
+ context 'GET /api/assets/search?query=Windows' do
43
+ it 'returns only assets with Windows assets' do
44
+ asset_collection = Controls.asset_search('Windows')
45
+ expect(asset_collection).to be_kind_of(Controls::AssetCollection)
46
+
47
+ asset_collection.resources.map(&:operating_system).each do |operating_system|
48
+ expect(operating_system).to match(/^windows/i)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../../spec_helper.rb'
2
+
3
+ describe '/api/security_controls' do
4
+ before do
5
+ login_to_environment
6
+ end
7
+
8
+ context 'GET /api/security_controls' do
9
+ it 'returns a list of security controls' do
10
+ security_controls = Controls.security_controls
11
+
12
+ security_controls.each do |security_control|
13
+ enabled_is_boolean = [TrueClass, FalseClass].include?(security_control.enabled.class)
14
+ expect(enabled_is_boolean).to be_true
15
+ end
16
+ end
17
+ end
18
+
19
+ context 'GET /api/security_controls/desktops-with-antivirus-deployed' do
20
+ it 'returns a single security control' do
21
+ security_control = Controls.security_controls('desktops-with-antivirus-deployed')
22
+
23
+ expect(security_control.name).to eq('desktops-with-antivirus-deployed')
24
+
25
+ enabled_is_boolean = [TrueClass, FalseClass].include?(security_control.enabled.class)
26
+ expect(enabled_is_boolean).to be_true
27
+ end
28
+ end
29
+ end
data/spec/matchers.rb CHANGED
@@ -3,19 +3,20 @@ require 'rspec/expectations'
3
3
  # Assessment Matchers
4
4
  RSpec::Matchers.define :match_assessment_format do
5
5
  match do |resource|
6
- # Reverses the coercion
7
6
  [
8
7
  resource.high_risk_asset_count,
9
8
  resource.id,
10
9
  resource.low_risk_asset_count,
11
10
  resource.medium_risk_asset_count,
12
- resource.timestamp.to_i,
11
+ resource.timestamp.to_i, # Reverses the coercion
13
12
  resource.total_asset_count
14
13
  ].each do |attribute|
15
14
  expect(attribute.class).to eq(Fixnum)
16
15
  end
17
16
 
18
- expect([TrueClass, FalseClass].include?(resource.assessing.class)).to be_true
19
- expect([Float].include?(resource.overall_risk_score.class)).to be_true
17
+ assessing_is_boolean = [TrueClass, FalseClass].include?(resource.assessing.class)
18
+ risk_score_is_float = [Float].include?(resource.overall_risk_score.class)
19
+ expect(assessing_is_boolean).to be_true
20
+ expect(risk_score_is_float).to be_true
20
21
  end
21
22
  end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,8 @@ module SpecHelpers
5
5
  def login_to_environment
6
6
  # Allow self-signed certs in continuous integration
7
7
  Controls.verify_ssl = false
8
+ Controls.api_endpoint = ENV['CONTROLS_API_ENDPOINT']
9
+ Controls.web_endpoint = ENV['CONTROLS_WEB_ENDPOINT']
8
10
  Controls.login(ENV['CONTROLS_USERNAME'], ENV['CONTROLS_PASSWORD'])
9
11
  end
10
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: controls
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.4
4
+ version: 1.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erran Carey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-25 00:00:00.000000000 Z
11
+ date: 2014-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dish
@@ -136,6 +136,8 @@ files:
136
136
  - lib/controls/response.rb
137
137
  - lib/controls/version.rb
138
138
  - spec/controls/client/assessments_spec.rb
139
+ - spec/controls/client/assets_spec.rb
140
+ - spec/controls/client/security_controls_spec.rb
139
141
  - spec/matchers.rb
140
142
  - spec/spec_helper.rb
141
143
  homepage: ''
@@ -164,6 +166,8 @@ specification_version: 4
164
166
  summary: This gem interfaces to Rapid7's **controls**insight API.
165
167
  test_files:
166
168
  - spec/controls/client/assessments_spec.rb
169
+ - spec/controls/client/assets_spec.rb
170
+ - spec/controls/client/security_controls_spec.rb
167
171
  - spec/matchers.rb
168
172
  - spec/spec_helper.rb
169
173
  has_rdoc: