nexpose 0.9.2 → 0.9.3
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 +4 -4
- data/lib/nexpose/ajax.rb +76 -48
- data/lib/nexpose/scan.rb +4 -4
- data/lib/nexpose/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3061d4a5d9569fa5aa6e9e71b59b8747688e3423
|
4
|
+
data.tar.gz: 0b79ee953da25edc842e37b8ac19b9ba9f4bbb7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31e606472483067a65ef775690c7f3f92ef26f50c9ce18d4840565d7cc3c3031d6b713ba379112ebe1677ef0d1e54e79cc17e33b44cc227570a91ae45f1555ce
|
7
|
+
data.tar.gz: a71ed17da304eb8c08a9fd5f5e8fad4b7efc019d0f172a12b0b215b0d342da31eb5da70dad4245d57f13c405bda2a44a53835f677c005a2b18ae7dc65e619694
|
data/lib/nexpose/ajax.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
module Nexpose
|
4
|
-
|
5
3
|
# Accessor to the Nexpose AJAX API.
|
6
4
|
# These core methods should allow direct access to underlying controllers
|
7
5
|
# in order to test functionality that is not currently exposed
|
@@ -10,6 +8,8 @@ module Nexpose
|
|
10
8
|
module AJAX
|
11
9
|
module_function
|
12
10
|
|
11
|
+
# Content type strings acceptect by Nexpose.
|
12
|
+
#
|
13
13
|
module CONTENT_TYPE
|
14
14
|
XML = 'text/xml; charset=UTF-8'
|
15
15
|
JSON = 'application/json; charset-utf-8'
|
@@ -28,7 +28,7 @@ module Nexpose
|
|
28
28
|
parameterize_uri(uri, options)
|
29
29
|
get = Net::HTTP::Get.new(uri)
|
30
30
|
get.set_content_type(content_type)
|
31
|
-
|
31
|
+
request(nsc, get)
|
32
32
|
end
|
33
33
|
|
34
34
|
# PUT call to a Nexpose controller.
|
@@ -43,7 +43,7 @@ module Nexpose
|
|
43
43
|
put = Net::HTTP::Put.new(uri)
|
44
44
|
put.set_content_type(content_type)
|
45
45
|
put.body = payload.to_s if payload
|
46
|
-
|
46
|
+
request(nsc, put)
|
47
47
|
end
|
48
48
|
|
49
49
|
# POST call to a Nexpose controller.
|
@@ -52,13 +52,14 @@ module Nexpose
|
|
52
52
|
# @param [String] uri Controller address relative to https://host:port
|
53
53
|
# @param [String|REXML::Document] payload XML document required by the call.
|
54
54
|
# @param [String] content_type Content type to use when issuing the POST.
|
55
|
+
# @param [Fixnum] timeout Set an explicit timeout for the HTTP request.
|
55
56
|
# @return [String|REXML::Document|Hash] The response from the call.
|
56
57
|
#
|
57
|
-
def post(nsc, uri, payload = nil, content_type = CONTENT_TYPE::XML)
|
58
|
+
def post(nsc, uri, payload = nil, content_type = CONTENT_TYPE::XML, timeout = nil)
|
58
59
|
post = Net::HTTP::Post.new(uri)
|
59
60
|
post.set_content_type(content_type)
|
60
61
|
post.body = payload.to_s if payload
|
61
|
-
|
62
|
+
request(nsc, post, timeout)
|
62
63
|
end
|
63
64
|
|
64
65
|
# PATCH call to a Nexpose controller.
|
@@ -73,7 +74,7 @@ module Nexpose
|
|
73
74
|
patch = Net::HTTP::Patch.new(uri)
|
74
75
|
patch.set_content_type(content_type)
|
75
76
|
patch.body = payload.to_s if payload
|
76
|
-
|
77
|
+
request(nsc, patch)
|
77
78
|
end
|
78
79
|
|
79
80
|
# POST call to a Nexpose controller that uses a form-post model.
|
@@ -90,7 +91,7 @@ module Nexpose
|
|
90
91
|
post = Net::HTTP::Post.new(uri)
|
91
92
|
post.set_content_type(content_type)
|
92
93
|
post.set_form_data(parameters)
|
93
|
-
|
94
|
+
request(nsc, post)
|
94
95
|
end
|
95
96
|
|
96
97
|
# DELETE call to a Nexpose controller.
|
@@ -101,9 +102,16 @@ module Nexpose
|
|
101
102
|
def delete(nsc, uri, content_type = CONTENT_TYPE::XML)
|
102
103
|
delete = Net::HTTP::Delete.new(uri)
|
103
104
|
delete.set_content_type(content_type)
|
104
|
-
|
105
|
+
request(nsc, delete)
|
105
106
|
end
|
106
107
|
|
108
|
+
###
|
109
|
+
# === Internal helper methods below this line. ===
|
110
|
+
#
|
111
|
+
# These are internal utility methods, not subject to backward compatibility
|
112
|
+
# concerns.
|
113
|
+
###
|
114
|
+
|
107
115
|
# Append the query parameters to given URI.
|
108
116
|
#
|
109
117
|
# @param [String] uri Controller address relative to https://host:port
|
@@ -114,59 +122,93 @@ module Nexpose
|
|
114
122
|
def parameterize_uri(uri, parameters)
|
115
123
|
params = Hash.try_convert(parameters)
|
116
124
|
unless params.nil? || params.empty?
|
117
|
-
uri = uri.concat(('?').concat(parameters.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')))
|
125
|
+
uri = uri.concat(('?').concat(parameters.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')))
|
118
126
|
end
|
119
127
|
uri
|
120
128
|
end
|
121
129
|
|
122
|
-
def preserving_preference(nsc, pref)
|
123
|
-
begin
|
124
|
-
orig = _get_rows(nsc, pref)
|
125
|
-
yield
|
126
|
-
ensure
|
127
|
-
_set_rows(nsc, pref, orig)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
###
|
132
|
-
# Internal helper methods
|
133
|
-
|
134
130
|
# Use the Nexpose::Connection to establish a correct HTTPS object.
|
135
|
-
def
|
131
|
+
def https(nsc, timeout = nil)
|
136
132
|
http = Net::HTTP.new(nsc.host, nsc.port)
|
133
|
+
http.read_timeout = timeout if timeout
|
137
134
|
http.use_ssl = true
|
138
135
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
139
136
|
http
|
140
137
|
end
|
141
138
|
|
142
139
|
# Attach necessary header fields.
|
143
|
-
def
|
140
|
+
def headers(nsc, request)
|
144
141
|
request.add_field('nexposeCCSessionID', nsc.session_id)
|
145
142
|
request.add_field('Cookie', "nexposeCCSessionID=#{nsc.session_id}")
|
146
143
|
end
|
147
144
|
|
148
|
-
def
|
149
|
-
http =
|
150
|
-
|
145
|
+
def request(nsc, request, timeout = nil)
|
146
|
+
http = https(nsc, timeout)
|
147
|
+
headers(nsc, request)
|
151
148
|
|
152
149
|
# Return response body if request is successful. Brittle.
|
153
150
|
response = http.request(request)
|
154
151
|
case response
|
155
|
-
when Net::HTTPOK
|
156
|
-
response.body
|
157
|
-
when Net::HTTPCreated
|
152
|
+
when Net::HTTPOK, Net::HTTPCreated
|
158
153
|
response.body
|
159
154
|
when Net::HTTPForbidden
|
160
155
|
raise Nexpose::PermissionError.new(response)
|
161
|
-
when Net::
|
162
|
-
|
156
|
+
when Net::HTTPFound
|
157
|
+
if response.header['location'] =~ /login/
|
158
|
+
raise Nexpose::AuthenticationFailed.new(response)
|
159
|
+
else
|
160
|
+
req_type = request.class.name.split('::').last.upcase
|
161
|
+
raise Nexpose::APIError.new(response, "#{req_type} request to #{request.path} failed. #{request.body}", response.code)
|
162
|
+
end
|
163
163
|
else
|
164
164
|
req_type = request.class.name.split('::').last.upcase
|
165
165
|
raise Nexpose::APIError.new(response, "#{req_type} request to #{request.path} failed. #{request.body}", response.code)
|
166
166
|
end
|
167
167
|
end
|
168
168
|
|
169
|
-
|
169
|
+
# Execute a block of code while presenving the preferences for any
|
170
|
+
# underlying table being accessed. Use this method when accessing data
|
171
|
+
# tables which are present in the UI to prevent existing row preferences
|
172
|
+
# from being set to 500.
|
173
|
+
#
|
174
|
+
# This is an internal utility method, not subject to backward compatibility
|
175
|
+
# concerns.
|
176
|
+
#
|
177
|
+
# @param [Connection] nsc Live connection to a Nepose console.
|
178
|
+
# @param [String] pref Preference key value to preserve.
|
179
|
+
#
|
180
|
+
def preserving_preference(nsc, pref)
|
181
|
+
begin
|
182
|
+
orig = get_rows(nsc, pref)
|
183
|
+
yield
|
184
|
+
ensure
|
185
|
+
set_rows(nsc, pref, orig)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
# Get a valid row preference value.
|
190
|
+
#
|
191
|
+
# This is an internal utility method, not subject to backward compatibility
|
192
|
+
# concerns.
|
193
|
+
#
|
194
|
+
# @param [Fixnum] val Value to get inclusive row preference for.
|
195
|
+
# @return [Fixnum] Valid row preference.
|
196
|
+
#
|
197
|
+
def row_pref_of(val)
|
198
|
+
if val.nil? || val > 100
|
199
|
+
500
|
200
|
+
elsif val > 50
|
201
|
+
100
|
202
|
+
elsif val > 25
|
203
|
+
50
|
204
|
+
elsif val > 10
|
205
|
+
25
|
206
|
+
else
|
207
|
+
10
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def get_rows(nsc, pref)
|
170
212
|
uri = '/ajax/user_pref_get.txml'
|
171
213
|
resp = get(nsc, uri, CONTENT_TYPE::XML, 'name' => "#{pref}.rows")
|
172
214
|
xml = REXML::Document.new(resp)
|
@@ -178,7 +220,7 @@ module Nexpose
|
|
178
220
|
end
|
179
221
|
end
|
180
222
|
|
181
|
-
def
|
223
|
+
def set_rows(nsc, pref, value)
|
182
224
|
uri = '/ajax/user_pref_set.txml'
|
183
225
|
params = { 'name' => "#{pref}.rows",
|
184
226
|
'value' => value }
|
@@ -188,19 +230,5 @@ module Nexpose
|
|
188
230
|
attr.value == '1'
|
189
231
|
end
|
190
232
|
end
|
191
|
-
|
192
|
-
def _row_pref_of(val)
|
193
|
-
if val.nil? || val > 100
|
194
|
-
500
|
195
|
-
elsif val > 50
|
196
|
-
100
|
197
|
-
elsif val > 25
|
198
|
-
50
|
199
|
-
elsif val > 10
|
200
|
-
25
|
201
|
-
else
|
202
|
-
10
|
203
|
-
end
|
204
|
-
end
|
205
233
|
end
|
206
234
|
end
|
data/lib/nexpose/scan.rb
CHANGED
@@ -238,7 +238,7 @@ module Nexpose
|
|
238
238
|
#
|
239
239
|
def past_scans(limit = nil)
|
240
240
|
uri = '/data/scan/global/scan-history'
|
241
|
-
rows = AJAX.
|
241
|
+
rows = AJAX.row_pref_of(limit)
|
242
242
|
params = { 'sort' => 'endTime', 'dir' => 'DESC', 'startIndex' => 0 }
|
243
243
|
AJAX.preserving_preference(self, 'global-completed-scans') do
|
244
244
|
data = DataTable._get_json_table(self, uri, params, rows, limit)
|
@@ -255,7 +255,7 @@ module Nexpose
|
|
255
255
|
# zip_file, if provided. Otherwise, returns raw ZIP binary data.
|
256
256
|
#
|
257
257
|
def export_scan(scan_id, zip_file = nil)
|
258
|
-
http = AJAX.
|
258
|
+
http = AJAX.https(self)
|
259
259
|
headers = { 'Cookie' => "nexposeCCSessionID=#{@session_id}",
|
260
260
|
'Accept-Encoding' => 'identity' }
|
261
261
|
resp = http.get("/data/scan/#{scan_id}/export", headers)
|
@@ -305,8 +305,8 @@ module Nexpose
|
|
305
305
|
post.set_content_type('multipart/form-data', boundary: data.bound)
|
306
306
|
|
307
307
|
# Avoiding AJAX#request, because the data can cause binary dump on error.
|
308
|
-
http = AJAX.
|
309
|
-
AJAX.
|
308
|
+
http = AJAX.https(self)
|
309
|
+
AJAX.headers(self, post)
|
310
310
|
response = http.request(post)
|
311
311
|
case response
|
312
312
|
when Net::HTTPOK
|
data/lib/nexpose/version.rb
CHANGED