ocean-rails 2.9.0 → 2.10.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 +4 -4
- data/app/helpers/application_helper.rb +6 -2
- data/lib/ocean/api.rb +88 -25
- data/lib/ocean/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 199cd45800bf7316cb1bb1b79f622ee1c6a74556
|
4
|
+
data.tar.gz: 8865f5b42851598a6b02ae921e62e42487d6ce9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7db74a25a4eeddb2b8ce989ab9725c211a272c4353aeabc4b3099ee55e7f7525a8af5f6b9abcd3f23164b549a1309163ddc829a572c10874c094ed1d0440a27d
|
7
|
+
data.tar.gz: 415353c47a9a3a8a09e4307262a1952f0dc7fcbf8a909145a1bd566bde5478c9500eea6ad6e43d689a0ed795ea2055376c682211e5b2923065c63a4e06ec7f55
|
@@ -33,13 +33,17 @@ module ApplicationHelper
|
|
33
33
|
|
34
34
|
|
35
35
|
#
|
36
|
-
# View helper predicates to determine
|
37
|
-
# to one or more of a list of Groups.
|
36
|
+
# View helper predicates to determine if the ApiUser behind the current
|
37
|
+
# authorisation belongs to one or more of a list of Groups.
|
38
38
|
#
|
39
39
|
def member_of_group?(*names)
|
40
40
|
@group_names && @group_names.intersect?(names.to_set)
|
41
41
|
end
|
42
42
|
|
43
|
+
#
|
44
|
+
# Returns true if the ApiUser behind the current authorisation belongs
|
45
|
+
# to the Ocean Group "Superusers".
|
46
|
+
#
|
43
47
|
def superuser?
|
44
48
|
member_of_group?("Superusers")
|
45
49
|
end
|
data/lib/ocean/api.rb
CHANGED
@@ -14,15 +14,6 @@ class Api
|
|
14
14
|
end
|
15
15
|
|
16
16
|
|
17
|
-
#
|
18
|
-
# Given that this service has authenticated successfully with the Auth service,
|
19
|
-
# returns the token returned as part of the authentication response.
|
20
|
-
#
|
21
|
-
def self.token
|
22
|
-
@token
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
17
|
#
|
27
18
|
# Adds environment info to the basename, so that testing and execution in various combinations
|
28
19
|
# of the Rails env and the Chef environment can be done without collision.
|
@@ -77,6 +68,13 @@ class Api
|
|
77
68
|
@response.response_code
|
78
69
|
end
|
79
70
|
|
71
|
+
#
|
72
|
+
# The status message of the HTTP response.
|
73
|
+
#
|
74
|
+
def message
|
75
|
+
@response.status_message
|
76
|
+
end
|
77
|
+
|
80
78
|
#
|
81
79
|
# Returns a hash of HTTP response headers.
|
82
80
|
#
|
@@ -95,12 +93,26 @@ class Api
|
|
95
93
|
@body ||= @response.response_body.blank? ? nil : JSON.parse(@response.response_body)
|
96
94
|
end
|
97
95
|
|
96
|
+
#
|
97
|
+
# Returns true if the HTTP request was a success and status == 2xx.
|
98
|
+
#
|
99
|
+
def success?
|
100
|
+
@response.success?
|
101
|
+
end
|
102
|
+
|
98
103
|
#
|
99
104
|
# Returns true if the HTTP request timed out.
|
100
105
|
#
|
101
106
|
def timed_out?
|
102
107
|
@response.timed_out?
|
103
108
|
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Returns true if the HTTP response was a success and not a 304.
|
112
|
+
#
|
113
|
+
def modified?
|
114
|
+
@response.modified?
|
115
|
+
end
|
104
116
|
end
|
105
117
|
|
106
118
|
|
@@ -117,26 +129,48 @@ class Api
|
|
117
129
|
# +args+, if given, should be a hash of query arguments to add to the URL.
|
118
130
|
# +headers+, if given, is a hash of extra HTTP headers for the request.
|
119
131
|
# +body+, if given, is the body of the request (:post, :put) as a string.
|
132
|
+
# +x_api_token+, if given, is a string which will be used as an X-API-Token header.
|
120
133
|
#
|
121
|
-
|
122
|
-
|
123
|
-
#
|
124
|
-
def self.request(url, http_method, args: nil, headers: {}, body: nil)
|
134
|
+
def self.request(url, http_method, args: nil, headers: {}, body: nil,
|
135
|
+
x_api_token: nil)
|
125
136
|
# Set up the request
|
126
137
|
headers['Accept'] = "application/json"
|
127
138
|
headers['Content-Type'] = "application/json"
|
128
139
|
headers['User-Agent'] = "Ocean"
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
140
|
+
headers['X-API-Token'] = x_api_token if x_api_token
|
141
|
+
|
142
|
+
while (true) do
|
143
|
+
request = Typhoeus::Request.new(url, method: http_method, headers: headers,
|
144
|
+
params: args, body: body)
|
145
|
+
# Run it
|
146
|
+
response = Response.new(request.run)
|
147
|
+
# If successful, return
|
148
|
+
return response if response.success?
|
149
|
+
|
150
|
+
# Not successful, deal with it
|
151
|
+
if response.timed_out?
|
152
|
+
raise Api::TimeoutError, "Api.request timed out"
|
153
|
+
elsif response.status == 0
|
154
|
+
# Could not get an http response, something's wrong.
|
155
|
+
raise Api::NoResponseError, "Api.request could not obtain a response"
|
156
|
+
elsif [400, 419].include?(response.status) && x_api_token.present?
|
157
|
+
# Re-authenticate and retry
|
158
|
+
Api.reset_service_token
|
159
|
+
headers['X-API-Token'] = Api.service_token
|
160
|
+
x_api_token = false # This prevents us from ending up here twice
|
161
|
+
else
|
162
|
+
# Failed
|
163
|
+
break
|
164
|
+
end
|
165
|
+
end
|
166
|
+
# Return the wrapped response to the failed request
|
167
|
+
response
|
137
168
|
end
|
138
169
|
|
139
170
|
|
171
|
+
class TimeoutError < StandardError; end
|
172
|
+
class NoResponseError < StandardError; end
|
173
|
+
|
140
174
|
#
|
141
175
|
# Makes an internal HTTP request to +host_url+ using the HTTP method +method+. The +resource_name+
|
142
176
|
# is used to obtain the latest version string of the resource. The arg +path+ is the
|
@@ -237,18 +271,47 @@ class Api
|
|
237
271
|
URI.escape(path, Regexp.new("[^/$\\-+_.!~*'()a-zA-Z0-9]"))
|
238
272
|
end
|
239
273
|
|
274
|
+
|
275
|
+
|
276
|
+
#
|
277
|
+
# Given that this service has authenticated successfully with the Auth service,
|
278
|
+
# returns the token returned as part of the authentication response.
|
279
|
+
# NB: This method is deprecated.
|
280
|
+
#
|
281
|
+
def self.token
|
282
|
+
ActiveSupport::Deprecation.warn "Api.token is deprecated, use Api.service_token instead and skip the explicit call to Api.authenticate.", caller
|
283
|
+
service_token
|
284
|
+
end
|
285
|
+
|
286
|
+
#
|
287
|
+
# This method returns the current token. If no current token has been obtained,
|
288
|
+
# authenticates.
|
289
|
+
#
|
290
|
+
def self.service_token
|
291
|
+
@service_token ||= authenticate
|
292
|
+
end
|
293
|
+
|
294
|
+
#
|
295
|
+
# Resets the service token, causing the next call to Api.service_token to
|
296
|
+
# re-authenticate.
|
297
|
+
#
|
298
|
+
def self.reset_service_token
|
299
|
+
@service_token = nil
|
300
|
+
end
|
301
|
+
|
240
302
|
|
241
303
|
#
|
242
304
|
# Authenticates against the Auth service (which must be deployed and running) with
|
243
|
-
# a given +username+ and +password+. If successful, the authentication token is returned.
|
244
|
-
# token is also assigned to the instance variable @
|
305
|
+
# a given +username+ and +password+. If successful, the authentication token is returned.
|
306
|
+
# The token is also assigned to the instance variable @service_token.
|
307
|
+
# If not successful, +nil+ is returned.
|
245
308
|
#
|
246
309
|
def self.authenticate(username=API_USER, password=API_PASSWORD)
|
247
310
|
response = Api.post(:auth, "/authentications", nil,
|
248
311
|
{'X-API-Authenticate' => encode_credentials(username, password)})
|
249
312
|
case response.status
|
250
313
|
when 201
|
251
|
-
@
|
314
|
+
@service_token = response.body['authentication']['token']
|
252
315
|
when 400
|
253
316
|
# Malformed credentials. Don't repeat the request.
|
254
317
|
nil
|
@@ -299,7 +362,7 @@ class Api
|
|
299
362
|
#
|
300
363
|
# e.g.
|
301
364
|
#
|
302
|
-
# Api.permitted?(@
|
365
|
+
# Api.permitted?(@service_token, query: "cms:texts:self:GET:*:*")
|
303
366
|
#
|
304
367
|
# Api.authorization_string can be used to produce the query string.
|
305
368
|
#
|
data/lib/ocean/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ocean-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Bengtson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|