conjur-api 4.16.0 → 4.19.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: 1774efca45d1103cedf13423ce1934f6c3a516e2
4
- data.tar.gz: 028c735666d90ab39cc214e22f9e4013195b3894
3
+ metadata.gz: d286220bf5ce8e32e9fa3ecbba374906d40739a8
4
+ data.tar.gz: d38f3fd537e81c44c537327642cc4ef6b6407537
5
5
  SHA512:
6
- metadata.gz: 885c346828a875234c194bbd27f5a06b353e1b894d2dfc4cdca2dbfcbae27404176211417f968b8f9ca5854d627670d64c6c8a716d5a2f9b2db26f41eca3e802
7
- data.tar.gz: 54bcfbb2d74a8f6e7c2079074716051d90369248b175a7f1a6fff434a808a4d2d4e41da24b484729b745012a751d3c982eb56f06ec3df24765a2cd0e55c87feb
6
+ metadata.gz: c1c6e64c7cc31108c7c9f2fc7dde41c10d4b57006c8963f0be3288b49e365f5fb5fbf97b58e744e9fcf9493feafc8070a6571a26d65b6c7b0b13298dffef209e
7
+ data.tar.gz: b64f23a2614041ec2f186d9f563ace280ea3cb1f791663c26d780b41911cc5b057e37161cb1d1b9588162cf7393c8290dff26cd2a7d45136bbdd35463f20d361
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # v4.19.0
2
+
3
+ * Rename `sudo` to `elevate` throughout the spec and docstrings. This is an incompatible change, but it
4
+ occurs before the Conjur 4.5 server that implements `elevate` is released.
5
+
6
+ # v4.18.0
7
+
8
+ * Add method `global_privilege_permitted?` to facilitate working with Conjur 4.5 global privileges.
9
+
10
+ # v4.17.0
11
+
12
+ * Add handling for `X-Forwarded-For` and `X-Conjur-Privilege` ("conjur sudo")
13
+ * Transform embedded whitespace in certificate string into newlines
14
+
1
15
  # v4.16.0
2
16
  * Add ssl_certificate option to allow certs to be provided as strings (helpful in heroku)
3
17
  * Add `Conjur::Configuration#apply_cert_config!` method to add certs from `#cert_file` and `#ssl_certificate`
data/README.md CHANGED
@@ -49,7 +49,7 @@ gemset or bundle.
49
49
 
50
50
  Once Conjur is configured, the connection can be established like this:
51
51
 
52
- ```ruby
52
+ ```
53
53
  conjur = Conjur::Authn.connect nil, noask: true
54
54
  ```
55
55
 
@@ -71,7 +71,7 @@ object.
71
71
 
72
72
  For example, specify the `account` and `appliance_url` (both of which are required) like this:
73
73
 
74
- ```ruby
74
+ ```
75
75
  Conjur.configuration.account = 'my-account'
76
76
  Conjur.configuration.appliance_url = 'https://conjur.mydomain.com/api'
77
77
  ```
@@ -82,13 +82,13 @@ configuration variable. For example, `appliance_url` is `CONJUR_APPLIANCE_URL`,
82
82
 
83
83
  In either case, you will also need to configure certificate trust. For example:
84
84
 
85
- ```ruby
85
+ ```
86
86
  OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE.add_file "/etc/conjur-yourorg.pem"
87
87
  ```
88
88
 
89
89
  Once Conjur is configured, you can create a new API client by providing a `login` and `api_key`:
90
90
 
91
- ```ruby
91
+ ```
92
92
  Conjur::API.new_from_key login, api_key
93
93
  ```
94
94
 
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Conjur
21
21
  class API
22
- VERSION = "4.16.0"
22
+ VERSION = "4.19.0"
23
23
  end
24
24
  end
data/lib/conjur/api.rb CHANGED
@@ -85,7 +85,12 @@ class RestClient::Resource
85
85
  #
86
86
  # @return {Conjur::API} the new api
87
87
  def conjur_api
88
- Conjur::API.new_from_token token
88
+ api = Conjur::API.new_from_token token, remote_ip
89
+ if conjur_privilege
90
+ api.with_privilege conjur_privilege
91
+ else
92
+ api
93
+ end
89
94
  end
90
95
 
91
96
  # Get an authentication token from the clients Authorization header.
@@ -104,6 +109,14 @@ class RestClient::Resource
104
109
  raise AuthorizationError.new("Authorization missing")
105
110
  end
106
111
  end
112
+
113
+ def remote_ip
114
+ options[:headers][:x_forwarded_for]
115
+ end
116
+
117
+ def conjur_privilege
118
+ options[:headers][:x_conjur_privilege]
119
+ end
107
120
 
108
121
  # The username this resource authenticates as.
109
122
  #
@@ -22,7 +22,6 @@ require 'conjur/resource'
22
22
 
23
23
  module Conjur
24
24
  class API
25
-
26
25
  #@!group Authorization: Resources
27
26
 
28
27
  # Create a {http://developer.conjur.net/reference/services/authorization/resource Conjur Resource}.
@@ -60,7 +59,7 @@ module Conjur
60
59
  r.create(options)
61
60
  end
62
61
  end
63
-
62
+
64
63
  # Find a resource by it's id. The id given to this method must be qualified by a kind, but the account is
65
64
  # optional.
66
65
  #
@@ -84,7 +83,7 @@ module Conjur
84
83
  #
85
84
  # @param identifier [String] a qualified resource identifier, optionally including an account
86
85
  # @return [Conjur::Resource] the resource, which may or may not exist
87
- def resource identifier
86
+ def resource identifier
88
87
  Resource.new(Conjur::Authz::API.host, credentials)[self.class.parse_resource_id(identifier).join('/')]
89
88
  end
90
89
 
@@ -148,5 +147,24 @@ module Conjur
148
147
  end
149
148
  end
150
149
  end
150
+
151
+ # The resource which grants global privileges to Conjur.
152
+ # Privileges given on this resource apply to any record in the system.
153
+ # There are two defined global privileges:
154
+ #
155
+ # * **elevate** permission is granted for any action.
156
+ # * **reveal** methods which list records will always return every matching
157
+ # record, regardless of whether the user has any privileges on these records or not.
158
+ # Services can also choose to attach additional semantics to *reveal*, such as allowing
159
+ # the user to show non-sensitive attributes of any record.
160
+ #
161
+ # Global privileges are available in Conjur 4.5 and later.
162
+ GLOBAL_PRIVILEGE_RESOURCE = "!:!:conjur"
163
+
164
+ # Checks whether the client has a particular global privilege.
165
+ # The global privileges are *elevate* and *reveal*.
166
+ def global_privilege_permitted? privilege
167
+ resource(GLOBAL_PRIVILEGE_RESOURCE).permitted? privilege
168
+ end
151
169
  end
152
170
  end
data/lib/conjur/base.rb CHANGED
@@ -100,10 +100,11 @@ module Conjur
100
100
  # api.user 'foo' # raises a 401 error
101
101
  #
102
102
  # @param [String] username the username to use when making authenticated requests.
103
- # @param [Sring] api_key the api key or password for `username`
103
+ # @param [String] api_key the api key or password for `username`
104
+ # @param [String] remote_ip the optional IP address to be recorded in the audit record.
104
105
  # @return [Conjur::API] an api that will authenticate with the given username and api key.
105
- def new_from_key(username, api_key)
106
- self.new username, api_key, nil
106
+ def new_from_key(username, api_key, remote_ip = nil)
107
+ self.new username, api_key, nil, remote_ip
107
108
  end
108
109
 
109
110
 
@@ -135,9 +136,10 @@ module Conjur
135
136
  # end
136
137
  #
137
138
  # @param [Hash] token the authentication token as parsed JSON to use when making authenticated requests
139
+ # @param [String] remote_ip the optional IP address to be recorded in the audit record.
138
140
  # @return [Conjur::API] an api that will authenticate with the token
139
- def new_from_token(token)
140
- self.new nil, nil, token
141
+ def new_from_token(token, remote_ip = nil)
142
+ self.new nil, nil, token, remote_ip
141
143
  end
142
144
  end
143
145
 
@@ -151,12 +153,14 @@ module Conjur
151
153
  # @param [String] username the username to authenticate as
152
154
  # @param [String] api_key the api key or password to use when authenticating
153
155
  # @param [Hash] token the token to use when making authenticated requuests.
156
+ # @param [String] remote_ip the optional IP address to be recorded in the audit record.
154
157
  #
155
158
  # @api internal
156
- def initialize username, api_key, token
159
+ def initialize username, api_key, token, remote_ip = nil
157
160
  @username = username
158
161
  @api_key = api_key
159
162
  @token = token
163
+ @remote_ip = remote_ip
160
164
 
161
165
  raise "Expecting ( username and api_key ) or token" unless ( username && api_key ) || token
162
166
  end
@@ -166,6 +170,14 @@ module Conjur
166
170
  #
167
171
  # @return [String] the api key, or nil if this instance was created from a token.
168
172
  attr_reader :api_key
173
+
174
+ #@!attribute [r] remote_ip
175
+ # An optional IP address to be recorded in the audit record for any actions performed by this API instance.
176
+ attr_reader :remote_ip
177
+
178
+ #@!attribute [r] privilege
179
+ # The optional global privilege (e.g. 'elevate' or 'reveal') which should be attempted on the request.
180
+ attr_accessor :privilege
169
181
 
170
182
  # The name of the user as which this api instance is authenticated. This is available whether the api
171
183
  # instance was created from credentials or an authentication token.
@@ -196,7 +208,7 @@ module Conjur
196
208
 
197
209
  @token ||= Conjur::API.authenticate(@username, @api_key)
198
210
 
199
- fail "obtained token is invalid" unless token_valid? # sanity check
211
+ validate_token
200
212
 
201
213
  return @token
202
214
  end
@@ -208,20 +220,47 @@ module Conjur
208
220
  # @raise [RestClient::Unauthorized] if fetching the token fails.
209
221
  # @see {#token}
210
222
  def credentials
211
- { headers: { authorization: "Token token=\"#{Base64.strict_encode64 token.to_json}\"" }, username: username }
223
+ headers = {}.tap do |h|
224
+ h[:authorization] = "Token token=\"#{Base64.strict_encode64 token.to_json}\""
225
+ h[:x_conjur_privilege] = @privilege if @privilege
226
+ h[:x_forwarded_for] = @remote_ip if @remote_ip
227
+ end
228
+ { headers: headers, username: username }
212
229
  end
213
230
 
231
+ # Return a new API object with the specified X-Conjur-Privilege.
232
+ #
233
+ # @return The API instance.
234
+ def with_privilege privilege
235
+ self.class.new(username, api_key, token, remote_ip).tap do |api|
236
+ api.privilege = privilege
237
+ end
238
+ end
239
+
214
240
  private
215
241
 
242
+ def token_valid?
243
+ begin
244
+ validate_token
245
+ return true
246
+ rescue Exception
247
+ return false
248
+ end
249
+ end
250
+
216
251
  # Check to see if @token is defined, and whether it's expired
217
252
  #
218
- # @return [Boolean] whether or not the token is valid.
219
- def token_valid?
220
- return false unless @token
253
+ # @raise [Exception] if the token is invalid
254
+ def validate_token
255
+ fail "token not present" unless @token
221
256
 
222
257
  # Actual token expiration is 8 minutes, but why cut it so close
223
258
  expiration = 5.minutes
224
- Time.now - Time.parse(@token['timestamp']) < expiration
259
+ lag = Time.now - Time.parse(@token['timestamp'])
260
+ unless lag < expiration
261
+ fail "obtained token is invalid: "\
262
+ "token timestamp is #{@token['timestamp']}, #{lag} seconds ago"
263
+ end
225
264
  end
226
265
  end
227
266
  end
@@ -421,7 +421,14 @@ module Conjur
421
421
  private
422
422
 
423
423
  def add_cert_string store, str
424
+ str = str.gsub(/\s+/, "\n")
425
+ str.gsub!("-----BEGIN\n", "-----BEGIN ")
426
+ str.gsub!("-----END\n", "-----END ")
424
427
  store.add_cert OpenSSL::X509::Certificate.new str
428
+ rescue OpenSSL::X509::CertificateError => ex
429
+ $stderr.puts "Invalid certificate:"
430
+ $stderr.puts str
431
+ raise ex
425
432
  rescue OpenSSL::X509::StoreError => ex
426
433
  raise ex unless ex.message == 'cert already in hash table'
427
434
  end
data/spec/lib/api_spec.rb CHANGED
@@ -226,7 +226,9 @@ describe Conjur::API do
226
226
  let(:login) { "bob" }
227
227
  let(:token) { { 'data' => login, 'timestamp' => Time.now.to_s } }
228
228
  subject { api }
229
- let(:api) { Conjur::API.new_from_token(token) }
229
+ let(:remote_ip) { nil }
230
+ let(:api_args) { [ token, remote_ip ].compact }
231
+ let(:api) { Conjur::API.new_from_token(*api_args) }
230
232
  let(:account) { 'some-account' }
231
233
  before { allow(Conjur::Core::API).to receive_messages conjur_account: account }
232
234
  end
@@ -242,11 +244,28 @@ describe Conjur::API do
242
244
  subject { super().credentials }
243
245
  it { is_expected.to eq({ headers: { authorization: "Token token=\"#{Base64.strict_encode64(token.to_json)}\"" }, username: login }) }
244
246
  end
247
+
248
+ describe "privileged" do
249
+ describe '#credentials' do
250
+ subject { super().with_privilege('elevate').credentials }
251
+ it { is_expected.to eq({ headers: { authorization: "Token token=\"#{Base64.strict_encode64(token.to_json)}\"", :x_conjur_privilege=>"elevate" }, username: login }) }
252
+ end
253
+ end
254
+
255
+ context "with remote_ip" do
256
+ let(:remote_ip) { "66.0.0.1" }
257
+ describe '#credentials' do
258
+ subject { super().credentials }
259
+ it { is_expected.to eq({ headers: { authorization: "Token token=\"#{Base64.strict_encode64(token.to_json)}\"", :x_forwarded_for=>"66.0.0.1" }, username: login }) }
260
+ end
261
+ end
245
262
  end
246
263
 
247
264
  context "from api key", logged_in: true do
248
265
  let(:api_key) { "theapikey" }
249
- let(:api) { Conjur::API.new_from_key(login, api_key) }
266
+ let(:api_args) { [ login, api_key, remote_ip ].compact }
267
+ let(:api) { Conjur::API.new_from_key(*api_args) }
268
+ let(:remote_ip) { nil }
250
269
  subject { api }
251
270
 
252
271
  it("should authenticate to get a token") do
@@ -257,6 +276,14 @@ describe Conjur::API do
257
276
  expect(api.credentials).to eq({ headers: { authorization: "Token token=\"#{Base64.strict_encode64(token.to_json)}\"" }, username: login })
258
277
  end
259
278
 
279
+ it("checks if the token is fresh") do
280
+ expired_token = token.merge 'timestamp' => 10.minutes.ago.to_s
281
+ expect(Conjur::API).to receive(:authenticate).with(login, api_key).and_return expired_token
282
+
283
+ expect(api.instance_variable_get("@token")).to eq(nil)
284
+ expect { api.token }.to raise_error /obtained token is invalid/
285
+ end
286
+
260
287
  context "with an expired token" do
261
288
  it "fetches a new one" do
262
289
  allow(Conjur::API).to receive(:authenticate).with(login, api_key).and_return token
@@ -273,12 +300,37 @@ describe Conjur::API do
273
300
 
274
301
  context "from logged-in RestClient::Resource" do
275
302
  let(:token_encoded) { Base64.strict_encode64(token.to_json) }
276
- let(:resource) { RestClient::Resource.new("http://example.com", { headers: { authorization: "Token token=\"#{token_encoded}\"" } })}
303
+ let(:headers) { { authorization: "Token token=\"#{token_encoded}\"" } }
304
+ let(:resource) { RestClient::Resource.new("http://example.com", { headers: headers })}
277
305
  it "can construct a new API instance" do
278
306
  api = resource.conjur_api
279
307
  expect(api.credentials[:headers][:authorization]).to eq("Token token=\"#{token_encoded}\"")
308
+ expect(api.credentials[:headers][:x_conjur_privilege]).to be_nil
309
+ expect(api.credentials[:headers][:x_forwarded_for]).to be_nil
280
310
  expect(api.credentials[:username]).to eq("bob")
281
311
  end
312
+
313
+ context "privileged" do
314
+ let(:headers) { { authorization: "Token token=\"#{token_encoded}\"", x_conjur_privilege: "elevate" } }
315
+ it "can clone itself" do
316
+ api = resource.conjur_api
317
+ expect(api.credentials[:headers][:authorization]).to eq("Token token=\"#{token_encoded}\"")
318
+ expect(api.credentials[:headers][:x_conjur_privilege]).to eq("elevate")
319
+ expect(api.credentials[:headers][:x_forwarded_for]).to be_nil
320
+ expect(api.credentials[:username]).to eq("bob")
321
+ end
322
+ end
323
+
324
+ context "privileged" do
325
+ let(:headers) { { authorization: "Token token=\"#{token_encoded}\"", x_forwarded_for: "66.0.0.1" } }
326
+ it "can clone itself" do
327
+ api = resource.conjur_api
328
+ expect(api.credentials[:headers][:authorization]).to eq("Token token=\"#{token_encoded}\"")
329
+ expect(api.credentials[:headers][:x_conjur_privilege]).to be_nil
330
+ expect(api.credentials[:headers][:x_forwarded_for]).to eq("66.0.0.1")
331
+ expect(api.credentials[:username]).to eq("bob")
332
+ end
333
+ end
282
334
  end
283
335
  end
284
336
 
@@ -219,12 +219,10 @@ describe Conjur::Configuration do
219
219
 
220
220
  let(:store){ double('default store') }
221
221
 
222
-
223
222
  before do
224
223
  stub_const 'OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE', store
225
224
  allow_any_instance_of(Conjur::Configuration).to receive(:ssl_certificate).and_return ssl_certificate
226
225
  allow_any_instance_of(Conjur::Configuration).to receive(:cert_file).and_return cert_file
227
-
228
226
  end
229
227
 
230
228
  context "when neither cert_file or ssl_certificate is present" do
@@ -240,7 +238,7 @@ describe Conjur::Configuration do
240
238
 
241
239
  context 'when both are given' do
242
240
  let(:cert_file){ '/path/to/cert.pem' }
243
- let(:ssl_certificate){ 'certificate contents' }
241
+ let(:ssl_certificate){ 'certificate-contents' }
244
242
  let(:cert){ double('certificate') }
245
243
  it 'calls store.add_cert with a certificate created from ssl_certificate' do
246
244
  expect(OpenSSL::X509::Certificate).to receive(:new).with(ssl_certificate).once.and_return cert
@@ -260,11 +258,35 @@ describe Conjur::Configuration do
260
258
 
261
259
  context 'when ssl_certificate is given' do
262
260
  let(:cert_file){ nil }
263
- let(:ssl_certificate){ 'certificate contents' }
261
+ let(:ssl_certificate){ "-----BEGIN CERTIFICATE----- MIIDUTCCAjmgAwIBAgIJAO4Lf1Rf2cciMA0GCSqGSIb3DQEBBQUAMDMxMTAvBgNV BAMTKGVjMi01NC05MS0yNDYtODQuY29tcHV0ZS0xLmFtYXpvbmF3cy5jb20wHhcN MTQxMDA4MjEwNTA5WhcNMjQxMDA1MjEwNTA5WjAzMTEwLwYDVQQDEyhlYzItNTQt OTEtMjQ2LTg0LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAx+OFANXNEYNsMR3Uvg4/72VG3LZO8yxrYaYzc3FZ NN3NpIOCZvRTC5S+OawsdEljHwfhdVoXdWNKgVJakSxsAnnaj11fA6XpfN60o6Fk i4q/BqwqgeNJjKAlElFsNz2scWFWRe49NHlj9qaq/yWZ8Cn0IeHy8j8F+jMek4zt dCSxVEayVG/k8RFmYCcluQc/1LuCjPiFwJU43AGkO+yvmOuYGivsNKY+54yuEZqF VDsjAjMsYXxgLx9y1F7Rq3CfeqY6IajR7pmmRup8/D9NyyyQuIML83mjTSvo0UYu rkdXPObd/m6gumscvXMl6SoJ5IPItvTA42MZqTaNzimF0QIDAQABo2gwZjBkBgNV HREEXTBbgglsb2NhbGhvc3SCBmNvbmp1coIcY29uanVyLW1hc3Rlci5pdHAuY29u anVyLm5ldIIoZWMyLTU0LTkxLTI0Ni04NC5jb21wdXRlLTEuYW1hem9uYXdzLmNv bTANBgkqhkiG9w0BAQUFAAOCAQEANk7P3ZEZHLgiTrLG13VAkm33FAvFzRG6akx1 jgNeRDgSaxRtrfJq3mnhsmD6hdvv+e6prPCFOjeEDheyCZyQDESdVEJBwytHVjnH dbvgMRaPm6OO8CyRyNjg3YcC36T//oQKOdAXXEcrtd0QbelBDYlKA7smJtznfhAb XypVdeS/6I4qvJi3Ckp5sQ1GszYhVXAvEeWeY59WwsTWYHLkzss9QShnigPyo3LY ZA5JVXofYi9DJ6VexP7sJNhCMrY2WnMpPcAOB9T7a6lcoXj6mWxvFys0xDIEOnc6 NGb+d47blphUKRZMAUZgYgFfMfmlyu1IXj03J8AuKtIMEwkXAA== -----END CERTIFICATE----- " }
262
+ let(:actual_certificate) {
263
+ <<-CERT
264
+ -----BEGIN CERTIFICATE-----
265
+ MIIDUTCCAjmgAwIBAgIJAO4Lf1Rf2cciMA0GCSqGSIb3DQEBBQUAMDMxMTAvBgNV
266
+ BAMTKGVjMi01NC05MS0yNDYtODQuY29tcHV0ZS0xLmFtYXpvbmF3cy5jb20wHhcN
267
+ MTQxMDA4MjEwNTA5WhcNMjQxMDA1MjEwNTA5WjAzMTEwLwYDVQQDEyhlYzItNTQt
268
+ OTEtMjQ2LTg0LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tMIIBIjANBgkqhkiG9w0B
269
+ AQEFAAOCAQ8AMIIBCgKCAQEAx+OFANXNEYNsMR3Uvg4/72VG3LZO8yxrYaYzc3FZ
270
+ NN3NpIOCZvRTC5S+OawsdEljHwfhdVoXdWNKgVJakSxsAnnaj11fA6XpfN60o6Fk
271
+ i4q/BqwqgeNJjKAlElFsNz2scWFWRe49NHlj9qaq/yWZ8Cn0IeHy8j8F+jMek4zt
272
+ dCSxVEayVG/k8RFmYCcluQc/1LuCjPiFwJU43AGkO+yvmOuYGivsNKY+54yuEZqF
273
+ VDsjAjMsYXxgLx9y1F7Rq3CfeqY6IajR7pmmRup8/D9NyyyQuIML83mjTSvo0UYu
274
+ rkdXPObd/m6gumscvXMl6SoJ5IPItvTA42MZqTaNzimF0QIDAQABo2gwZjBkBgNV
275
+ HREEXTBbgglsb2NhbGhvc3SCBmNvbmp1coIcY29uanVyLW1hc3Rlci5pdHAuY29u
276
+ anVyLm5ldIIoZWMyLTU0LTkxLTI0Ni04NC5jb21wdXRlLTEuYW1hem9uYXdzLmNv
277
+ bTANBgkqhkiG9w0BAQUFAAOCAQEANk7P3ZEZHLgiTrLG13VAkm33FAvFzRG6akx1
278
+ jgNeRDgSaxRtrfJq3mnhsmD6hdvv+e6prPCFOjeEDheyCZyQDESdVEJBwytHVjnH
279
+ dbvgMRaPm6OO8CyRyNjg3YcC36T//oQKOdAXXEcrtd0QbelBDYlKA7smJtznfhAb
280
+ XypVdeS/6I4qvJi3Ckp5sQ1GszYhVXAvEeWeY59WwsTWYHLkzss9QShnigPyo3LY
281
+ ZA5JVXofYi9DJ6VexP7sJNhCMrY2WnMpPcAOB9T7a6lcoXj6mWxvFys0xDIEOnc6
282
+ NGb+d47blphUKRZMAUZgYgFfMfmlyu1IXj03J8AuKtIMEwkXAA==
283
+ -----END CERTIFICATE-----
284
+ CERT
285
+ }
264
286
  let(:cert){ double('cert') }
265
287
 
266
288
  before do
267
- expect(OpenSSL::X509::Certificate).to receive(:new).with(ssl_certificate).at_least(:once).and_return cert
289
+ expect(OpenSSL::X509::Certificate).to receive(:new).with(actual_certificate).at_least(:once).and_return cert
268
290
  end
269
291
 
270
292
  it 'calls store.add_cert with a certificate created from ssl_certificate' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conjur-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.16.0
4
+ version: 4.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafal Rzepecki
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-28 00:00:00.000000000 Z
12
+ date: 2015-08-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client