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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a931fab98c0b77adbd93d419a208be124d3777a
4
- data.tar.gz: a25db8fe648e413a944a42e7ebd2397f0c4452d9
3
+ metadata.gz: 199cd45800bf7316cb1bb1b79f622ee1c6a74556
4
+ data.tar.gz: 8865f5b42851598a6b02ae921e62e42487d6ce9b
5
5
  SHA512:
6
- metadata.gz: 1d8a941fb42ab893e71e5f7211c1b807c2551a882fe448fd6fa7caf1608b48004f6f14bd549102034bd565044cc6fd847c909f617de7f6477b102842a331abcc
7
- data.tar.gz: afe18d5dedc343d1b7e6a0221cfc512d15ed9e04a4bbeeb86fbb80811cfbe393935a01d23333724246654274ccda2d0bc0836ae21492094d5e27d17f743b601a
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 whether the ApiUser belongs
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
@@ -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
- # Api.request won't raise an exception if the request times out or the operation fails.
122
- # Instead, all such information is encapsulated in the Api::Response instance returned.
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
- request = Typhoeus::Request.new(url, method: http_method, headers: headers,
130
- params: args, body: body)
131
- # Run it
132
- response = request.run
133
- # Retries would be done here
134
-
135
- # Return the response
136
- Response.new(response)
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. The
244
- # token is also assigned to the instance variable @token. If not successful, +nil+ is returned.
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
- @token = response.body['authentication']['token']
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?(@token, query: "cms:texts:self:GET:*:*")
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
  #
@@ -1,3 +1,3 @@
1
1
  module Ocean
2
- VERSION = "2.9.0"
2
+ VERSION = "2.10.0"
3
3
  end
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.9.0
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-19 00:00:00.000000000 Z
11
+ date: 2014-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus