nexpose 5.2.0 → 5.3.0

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: 226804f061b34388cd0155b1df7baf53feadac6c
4
- data.tar.gz: 9999ed21b40eb28c4486abb55e16fd9663f0ce83
3
+ metadata.gz: 66875e048dcb1dd081e1ccc2fb97b11820d21539
4
+ data.tar.gz: 3aa8c1daab1a48863388b39a19e5e59c42dbde4d
5
5
  SHA512:
6
- metadata.gz: b24bf8a742c9faf2e1cd66c8b603cc41229ecf3fe7840b235c4c33fae6c23bcbc782c1152f8b8c860457ef64b8f526c71b8763c25dc6d6533a616ba0a77c40a1
7
- data.tar.gz: 9c1c6b3418dd18d1627de2955a0cd1fe151d86c2ae972e0bc35488832af377f57ae71d52aad31861719ab8ba964f510a1cc500d75a8cdab2463d019c83648b57
6
+ metadata.gz: 9c5dc066cb954cb27640d9d95d571c584958f6645323e1f50473409a26a7d84ea6bdc864fb739a9ef6d75bd2c19c080f60ba4936fb7bce77d622cc28e327aba2
7
+ data.tar.gz: 17cb67e994f1d621feb14640a92b2c7418b40a37e288e72617483538be157982a04c5c7b683102a6e52f9d63b84838db20ebb04092613ce9a00caadeb38c4e79
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nexpose (5.2.0)
4
+ nexpose (5.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/lib/nexpose/ajax.rb CHANGED
@@ -135,7 +135,11 @@ module Nexpose
135
135
  http = Net::HTTP.new(nsc.host, nsc.port)
136
136
  http.read_timeout = timeout if timeout
137
137
  http.use_ssl = true
138
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
138
+ if nsc.trust_store.nil?
139
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
140
+ else
141
+ http.cert_store = nsc.trust_store
142
+ end
139
143
  http
140
144
  end
141
145
 
@@ -17,11 +17,14 @@ module Nexpose
17
17
  attr_reader :raw_response
18
18
  attr_reader :raw_response_data
19
19
 
20
- def initialize(req, url, api_version = '1.1')
20
+ attr_reader :trust_store
21
+
22
+ def initialize(req, url, api_version = '1.1', trust_store = nil)
21
23
  @url = url
22
24
  @req = req
23
25
  @api_version = api_version
24
26
  @url = @url.sub('API_VERSION', @api_version)
27
+ @trust_store = trust_store
25
28
  prepare_http_client
26
29
  end
27
30
 
@@ -34,7 +37,11 @@ module Nexpose
34
37
  # a confirmation when the nexpose host is not localhost. In a perfect world, we would present
35
38
  # the server signature before accepting it, but this requires either a direct callback inside
36
39
  # of this module back to whatever UI, or opens a race condition between accept and attempt.
37
- @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
40
+ if @trust_store.nil?
41
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
42
+ else
43
+ @http.cert_store = @trust_store
44
+ end
38
45
  @headers = {'Content-Type' => 'text/xml'}
39
46
  @success = false
40
47
  end
@@ -93,7 +100,7 @@ module Nexpose
93
100
  # drops our HTTP connection before processing. We try 5 times to establish a
94
101
  # connection in these situations. The actual exception occurs in the Ruby
95
102
  # http library, which is why we use such generic error classes.
96
- rescue OpenSSL::SSL::SSLError
103
+ rescue OpenSSL::SSL::SSLError => e
97
104
  if @conn_tries < 5
98
105
  @conn_tries += 1
99
106
  retry
@@ -133,8 +140,8 @@ module Nexpose
133
140
  @res.root.attributes(*args)
134
141
  end
135
142
 
136
- def self.execute(url, req, api_version='1.1', options = {})
137
- obj = self.new(req.to_s, url, api_version)
143
+ def self.execute(url, req, api_version = '1.1', options = {}, trust_store = nil)
144
+ obj = self.new(req.to_s, url, api_version, trust_store)
138
145
  obj.execute(options)
139
146
  raise APIError.new(obj, "Action failed: #{obj.error}") unless obj.success
140
147
  obj
@@ -8,6 +8,19 @@ module Nexpose
8
8
  # # Create a new Nexpose::Connection from a URI or "URI" String
9
9
  # nsc = Connection.from_uri('https://10.1.40.10:3780', 'nxadmin', 'password')
10
10
  #
11
+ # # Create a new Nexpose::Connection with a specific port
12
+ # nsc = Connection.new('10.1.40.10', 'nxadmin', 'password', 443)
13
+ #
14
+ # # Create a new Nexpose::Connection with a silo identifier
15
+ # nsc = Connection.new('10.1.40.10', 'nxadmin', 'password', 3780, 'default')
16
+ #
17
+ # # Create a new Nexpose::Connection with a two-factor authentication (2FA) token
18
+ # nsc = Connection.new('10.1.40.10', 'nxadmin', 'password', 3780, nil, '123456')
19
+ #
20
+ # # Create a new Nexpose::Connection with an excplicitly trusted web certificate
21
+ # trusted_cert = ::File.read('cert.pem')
22
+ # nsc = Connection.new('10.1.40.10', 'nxadmin', 'password', 3780, nil, nil, trusted_cert)
23
+ #
11
24
  # # Login to NSC and Establish a Session ID
12
25
  # nsc.login
13
26
  #
@@ -44,20 +57,34 @@ module Nexpose
44
57
  # The last XML response received by this object, useful for debugging.
45
58
  attr_reader :response_xml
46
59
 
60
+ # The trust store to validate connections against if any
61
+ attr_reader :trust_store
62
+
47
63
  # A constructor to load a Connection object from a URI
48
- def self.from_uri(uri, user, pass, silo_id = nil, token = nil)
64
+ def self.from_uri(uri, user, pass, silo_id = nil, token = nil, trust_cert = nil)
49
65
  uri = URI.parse(uri)
50
- new(uri.host, user, pass, uri.port, silo_id, token)
66
+ new(uri.host, user, pass, uri.port, silo_id, token, trust_cert)
51
67
  end
52
68
 
53
69
  # A constructor for Connection
54
- def initialize(ip, user, pass, port = 3780, silo_id = nil, token = nil)
70
+ #
71
+ # @param [String] ip The IP address or hostname/FQDN of the Nexpose console.
72
+ # @param [String] user The username for Nexpose sessions.
73
+ # @param [String] pass The password for Nexpose sessions.
74
+ # @param [Fixnum] port The port number of the Nexpose console.
75
+ # @param [String] silo_id The silo identifier for Nexpose sessions.
76
+ # @param [String] token The two-factor authentication (2FA) token for Nexpose sessions.
77
+ # @param [String] trust_cert The PEM-formatted web certificate of the Nexpose console. Used for SSL validation.
78
+ def initialize(ip, user, pass, port = 3780, silo_id = nil, token = nil, trust_cert = nil)
55
79
  @host = ip
56
80
  @port = port
57
81
  @username = user
58
82
  @password = pass
59
83
  @token = token
60
84
  @silo_id = silo_id
85
+ unless trust_cert.nil?
86
+ @trust_store = create_trust_store(trust_cert)
87
+ end
61
88
  @session_id = nil
62
89
  @url = "https://#{@host}:#{@port}/api/API_VERSION/xml"
63
90
  end
@@ -88,7 +115,7 @@ module Nexpose
88
115
  def execute(xml, version = '1.1', options = {})
89
116
  @request_xml = xml.to_s
90
117
  @api_version = version
91
- response = APIRequest.execute(@url, @request_xml, @api_version, options)
118
+ response = APIRequest.execute(@url, @request_xml, @api_version, options, @trust_store)
92
119
  @response_xml = response.raw_response_data
93
120
  response
94
121
  end
@@ -104,7 +131,11 @@ module Nexpose
104
131
  uri = URI.parse(url)
105
132
  http = Net::HTTP.new(@host, @port)
106
133
  http.use_ssl = true
107
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE # XXX: security issue
134
+ if @trust_store.nil?
135
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE # XXX: security issue
136
+ else
137
+ http.cert_store = @trust_store
138
+ end
108
139
  headers = {'Cookie' => "nexposeCCSessionID=#{@session_id}"}
109
140
  resp = http.get(uri.to_s, headers)
110
141
 
@@ -114,5 +145,14 @@ module Nexpose
114
145
  resp.body
115
146
  end
116
147
  end
148
+
149
+ def create_trust_store(trust_cert)
150
+ store = OpenSSL::X509::Store.new
151
+ store.trust
152
+ store.add_cert(OpenSSL::X509::Certificate.new(trust_cert))
153
+ store
154
+ end
155
+
156
+ private :create_trust_store
117
157
  end
118
158
  end
@@ -1,4 +1,4 @@
1
1
  module Nexpose
2
2
  # The latest version of the Nexpose gem
3
- VERSION = '5.2.0'
3
+ VERSION = '5.3.0'
4
4
  end
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: 5.2.0
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HD Moore
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2017-01-31 00:00:00.000000000 Z
16
+ date: 2017-02-14 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: bundler