nexpose 0.8.10 → 0.8.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81928c1e3298ba80b864e0d14499f58a9a41eae2
4
- data.tar.gz: dcbe6c5b9df95b254fa98f3eb5ec2041492d389a
3
+ metadata.gz: 9a8af56d94e621eaf5a5c7aba69a52c4b840fe72
4
+ data.tar.gz: aed5d663662dcc7364d08c3c23e80e036786b3ca
5
5
  SHA512:
6
- metadata.gz: aa9189178c6c2d497635cc871473f78277abe75374bcf32ac883303463b079b73bc5bdacdac0d8292fcfbd0d326f1d6754235fe2b3ab8d19dcbb260c651cb09e
7
- data.tar.gz: 7fc4dc7d5a376c7a6e1a0f440e48b532cb73acb1c4470973528fb228be3d8ccbfb60d1d6acd55ce9c1ee00d3aed91dea79b691b484cfddd3bd0374bef0a5690e
6
+ metadata.gz: 309661c597363464b8f47162b8f31bcf0914f699938da2772bd8554b589a3217d9b10540e36b65c1188a20555fc6c2d59e0dd68143e1ab099cf8bb54bed970ce
7
+ data.tar.gz: 60e5a8f6050b052484f774ed9a32ad47a9d1046fa8551d5e0574926990e2e3327133a2c8544a668ea4461b592f69686f98a263d35697240b677a612d1dbd37f0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in nexpose.gemspec
4
+ gemspec
data/Rakefile CHANGED
@@ -1,16 +1,5 @@
1
1
  # encoding: utf-8
2
-
3
- task :build do
4
- Rake::Task['clean'].execute
5
- puts "[*] Building nexpose.gemspec"
6
- system "gem build nexpose.gemspec &> /dev/null"
7
- end
8
-
9
- task :release => :build do
10
- puts "[*] Pushing nexpose to rubygems.org"
11
- system "gem push nexpose-*.gem &> /dev/null"
12
- Rake::Task['clean'].execute
13
- end
2
+ require 'bundler/gem_tasks'
14
3
 
15
4
  task :clean do
16
5
  system "rm *.gem &> /dev/null"
data/lib/nexpose/ajax.rb CHANGED
@@ -185,5 +185,19 @@ module Nexpose
185
185
  attr.value == '1'
186
186
  end
187
187
  end
188
+
189
+ def _row_pref_of(val)
190
+ if val.nil? || val > 100
191
+ 500
192
+ elsif val > 50
193
+ 100
194
+ elsif val > 25
195
+ 50
196
+ elsif val > 10
197
+ 25
198
+ else
199
+ 10
200
+ end
201
+ end
188
202
  end
189
203
  end
@@ -1,9 +1,6 @@
1
1
  module Nexpose
2
-
3
- # Constants
4
-
2
+ # Constants useful across the Nexpose module.
5
3
  module Scope
6
-
7
4
  GLOBAL = 'global'
8
5
  SILO = 'silo'
9
6
  end
@@ -27,7 +24,6 @@ module Nexpose
27
24
  # the application will send reports via e-mail to access-list members and
28
25
  # non-members.
29
26
  class Email
30
-
31
27
  # Send as file attachment or zipped file to individuals who are not members
32
28
  # of the report access list. One of: file|zip
33
29
  attr_accessor :send_as
@@ -164,6 +160,7 @@ module Nexpose
164
160
  end
165
161
  end
166
162
 
163
+ # Organization configuration, as used in Site and Silo.
167
164
  class Organization
168
165
  attr_accessor :name
169
166
  attr_accessor :url
@@ -178,7 +175,7 @@ module Nexpose
178
175
  attr_accessor :country
179
176
 
180
177
  def initialize(&block)
181
- instance_eval &block if block_given?
178
+ instance_eval(&block) if block_given?
182
179
  end
183
180
 
184
181
  def self.parse(xml)
@@ -14,11 +14,14 @@ module Nexpose
14
14
  # @param [Connection] console API connection to a Nexpose console.
15
15
  # @param [String] address Controller address relative to https://host:port
16
16
  # @param [Hash] parameters Parameters that need to be sent to the controller
17
- # @param [Integer] pagination size
18
- # @param [Integer] number of records to return, gets all if not specified
19
- # The following attributes need to be provided:
17
+ # The following attributes may need to be provided:
20
18
  # 'sort' Column to sort by
21
19
  # 'table-id' The ID of the table to get from this controller
20
+ # @param [Fixnum] page_size Number of records to include per page.
21
+ # Value must conform to supported defaults: -1, 10, 25, 50, 100, 500.
22
+ # @param [Fixnum] records number of records to return, gets all if not
23
+ # specified.
24
+ # @param [Boolean] post Whether to use form post or get to retrieve data.
22
25
  # @return [Array[Hash]] An array of hashes representing the requested table.
23
26
  #
24
27
  # Example usage:
@@ -41,8 +44,11 @@ module Nexpose
41
44
 
42
45
  response = request.(parameters)
43
46
  data = JSON.parse(response)
44
- total = records || data['totalRecords']
47
+
48
+ # Don't attept to grab more records than there are.
49
+ total = data['totalRecords']
45
50
  return [] if total == 0
51
+ total = records.nil? ? total : [records, total].min
46
52
 
47
53
  rows = []
48
54
  parameters['results'] = page_size
@@ -8,7 +8,7 @@ module Nexpose
8
8
 
9
9
  # Whether control scanning in enabled. A feature tied to ControlsInsight
10
10
  # integration.
11
- attr_accessor :control_scanning
11
+ attr_reader :control_scanning
12
12
 
13
13
  # XML document representing the entire configuration.
14
14
  attr_reader :xml
@@ -19,7 +19,7 @@ module Nexpose
19
19
  @xml = xml
20
20
 
21
21
  @asset_exclusions = HostOrIP.parse(xml)
22
- @control_scanning = _get_control_scanning(xml)
22
+ @control_scanning = parse_control_scanning_from_xml(xml)
23
23
  end
24
24
 
25
25
  # Returns true if controls scanning is enabled.
@@ -27,6 +27,11 @@ module Nexpose
27
27
  control_scanning
28
28
  end
29
29
 
30
+ # Enables/disables controls scanning
31
+ def control_scanning=(enabled)
32
+ add_control_scanning_to_xml(xml, enabled)
33
+ end
34
+
30
35
  # Save any updates to this settings object to the Nexpose console.
31
36
  #
32
37
  # @param [Connection] nsc Connection to a Nexpose console.
@@ -39,8 +44,8 @@ module Nexpose
39
44
  risk_model.add_attribute('recalculation_duration', 'do_not_recalculate')
40
45
  end
41
46
 
42
- _replace_exclusions(xml, asset_exclusions)
43
- _set_control_scanning(xml, control_scanning)
47
+ replace_exclusions(xml, asset_exclusions)
48
+ add_control_scanning_to_xml(xml, control_scanning)
44
49
 
45
50
  response = AJAX.post(nsc, '/data/admin/global-settings', xml)
46
51
  XMLUtils.success? response
@@ -85,8 +90,10 @@ module Nexpose
85
90
  new(REXML::Document.new(response))
86
91
  end
87
92
 
93
+ private
94
+
88
95
  # Internal method for updating exclusions before saving.
89
- def _replace_exclusions(xml, exclusions)
96
+ def replace_exclusions(xml, exclusions)
90
97
  xml.elements.delete('//ExcludedHosts')
91
98
  elem = xml.root.add_element('ExcludedHosts')
92
99
  exclusions.each do |exclusion|
@@ -95,7 +102,7 @@ module Nexpose
95
102
  end
96
103
 
97
104
  # Internal method for parsing XML for whether control scanning in enabled.
98
- def _get_control_scanning(xml)
105
+ def parse_control_scanning_from_xml(xml)
99
106
  enabled = false
100
107
  if elem = REXML::XPath.first(xml, '//enableControlsScan[@enabled]')
101
108
  enabled = elem.attribute('enabled').value.to_i == 1
@@ -104,7 +111,7 @@ module Nexpose
104
111
  end
105
112
 
106
113
  # Internal method for updating control scanning before saving.
107
- def _set_control_scanning(xml, enabled)
114
+ def add_control_scanning_to_xml(xml, enabled)
108
115
  if elem = REXML::XPath.first(xml, '//enableControlsScan')
109
116
  elem.attributes['enabled'] = enabled ? '1' : '0'
110
117
  else
data/lib/nexpose/scan.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  module Nexpose
2
-
3
2
  class Connection
4
3
  include XMLUtils
5
4
 
@@ -110,7 +109,7 @@ module Nexpose
110
109
  # @param [HostName|IPRange] asset Asset to append to XML.
111
110
  #
112
111
  def _append_asset!(xml, asset)
113
- if asset.kind_of? Nexpose::IPRange
112
+ if asset.is_a? Nexpose::IPRange
114
113
  xml.add_element('range', { 'from' => asset.from, 'to' => asset.to })
115
114
  else # Assume HostName
116
115
  host = REXML::Element.new('host')
@@ -227,6 +226,26 @@ module Nexpose
227
226
  end
228
227
  end
229
228
 
229
+ # Get a history of past scans for this console, sorted by most recent first.
230
+ #
231
+ # Please note that for consoles with a deep history of scanning, this method
232
+ # could return an excessive amount of data (and take quite a bit of time to
233
+ # retrieve). Consider limiting the amount of data with the optional argument.
234
+ #
235
+ # @param [Fixnum] limit The maximum number of records to return from this call.
236
+ # @return [Array[CompletedScan]] List of completed scans, ordered by most
237
+ # recently completed first.
238
+ #
239
+ def past_scans(limit = nil)
240
+ uri = '/data/scan/global/scan-history'
241
+ rows = AJAX._row_pref_of(limit)
242
+ params = { 'sort' => 'endTime', 'dir' => 'DESC', 'startIndex' => 0 }
243
+ AJAX.preserving_preference(self, 'global-completed-scans') do
244
+ data = DataTable._get_json_table(self, uri, params, rows, limit)
245
+ data.map(&CompletedScan.method(:parse_json))
246
+ end
247
+ end
248
+
230
249
  # Export the data associated with a single scan, and optionally store it in
231
250
  # a zip-compressed file under the provided name.
232
251
  #
@@ -276,7 +295,7 @@ module Nexpose
276
295
  def import_scan(site_id, zip_file)
277
296
  data = Rex::MIME::Message.new
278
297
  data.add_part(site_id.to_s, nil, nil, 'form-data; name="siteid"')
279
- data.add_part(self.session_id, nil, nil, 'form-data; name="nexposeCCSessionID"')
298
+ data.add_part(session_id, nil, nil, 'form-data; name="nexposeCCSessionID"')
280
299
  scan = File.new(zip_file, 'rb')
281
300
  data.add_part(scan.read, 'application/zip', 'binary',
282
301
  "form-data; name=\"scan\"; filename=\"#{zip_file}\"")
@@ -316,7 +335,6 @@ module Nexpose
316
335
  # can be rather verbose and isn't useful for many automation scenarios.
317
336
  #
318
337
  class ScanData
319
-
320
338
  # The Scan ID of the Scan
321
339
  attr_reader :scan_id
322
340
  # The site that was scanned.
@@ -582,6 +600,10 @@ module Nexpose
582
600
  class CompletedScan
583
601
  # Unique identifier of a scan.
584
602
  attr_reader :id
603
+ # Site ID for which the scan was run.
604
+ attr_reader :site_id
605
+ # Final status of the scan. One of :completed, :stopped, :aborted, :unknown.
606
+ attr_reader :status
585
607
  # Start time of the scan.
586
608
  attr_reader :start_time
587
609
  # Completion time of the scan.
@@ -609,6 +631,8 @@ module Nexpose
609
631
  def self.parse_json(json)
610
632
  new do
611
633
  @id = json['scanID']
634
+ @site_id = json['siteID']
635
+ @status = CompletedScan._parse_status(json['status'])
612
636
  @start_time = Time.at(json['startTime'] / 1000)
613
637
  @end_time = Time.at(json['endTime'] / 1000)
614
638
  @duration = json['duration']
@@ -619,5 +643,19 @@ module Nexpose
619
643
  @engine_name = json['scanEngineName']
620
644
  end
621
645
  end
646
+
647
+ # Internal method to parsing status codes.
648
+ def self._parse_status(code)
649
+ case code
650
+ when 'C'
651
+ :completed
652
+ when 'S'
653
+ :stopped
654
+ when 'A'
655
+ :aborted
656
+ else
657
+ :unknown
658
+ end
659
+ end
622
660
  end
623
661
  end
@@ -0,0 +1,4 @@
1
+ module Nexpose
2
+ # The latest version of the Nexpose gem
3
+ VERSION = '0.8.11'
4
+ end
data/lib/nexpose.rb CHANGED
@@ -94,6 +94,7 @@ require 'nexpose/vuln'
94
94
  require 'nexpose/vuln_exception'
95
95
  require 'nexpose/connection'
96
96
  require 'nexpose/maint'
97
+ require 'nexpose/version'
97
98
 
98
99
  module Nexpose
99
100
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexpose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.10
4
+ version: 0.8.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - HD Moore
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-10-29 00:00:00.000000000 Z
14
+ date: 2014-11-04 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rex
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: 1.6.2
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.3'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.3'
56
70
  description: This gem provides a Ruby API to the Nexpose vulnerability management
57
71
  product by Rapid7.
58
72
  email:
@@ -66,6 +80,7 @@ extra_rdoc_files:
66
80
  - README.markdown
67
81
  files:
68
82
  - COPYING
83
+ - Gemfile
69
84
  - README.markdown
70
85
  - Rakefile
71
86
  - lib/README.md
@@ -105,6 +120,7 @@ files:
105
120
  - lib/nexpose/ticket.rb
106
121
  - lib/nexpose/user.rb
107
122
  - lib/nexpose/util.rb
123
+ - lib/nexpose/version.rb
108
124
  - lib/nexpose/vuln.rb
109
125
  - lib/nexpose/vuln_exception.rb
110
126
  homepage: https://github.com/rapid7/nexpose-client