conjur-api 4.15.0 → 4.16.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5364b2c4521be8b3f6b3fce20269873ac72a5ec8
4
- data.tar.gz: e4e22c72cae8780bfe0263525156e5c57c0d5510
3
+ metadata.gz: 1774efca45d1103cedf13423ce1934f6c3a516e2
4
+ data.tar.gz: 028c735666d90ab39cc214e22f9e4013195b3894
5
5
  SHA512:
6
- metadata.gz: 982cbf720ebb14461e0868a0c8281d14a6561b5335004270780ff45e393fbe93f5ddd755b60c127ab90aedf9b3f051a01f16b1bcb2a733293cb7199ef4f1f766
7
- data.tar.gz: 9fbb761715f485f823b20a4493a53a753bca25d1217632c126bc03ced49fab69bb81922bb132dbaebb49d2e81c901f8567c9c26683031448214101725e86aad1
6
+ metadata.gz: 885c346828a875234c194bbd27f5a06b353e1b894d2dfc4cdca2dbfcbae27404176211417f968b8f9ca5854d627670d64c6c8a716d5a2f9b2db26f41eca3e802
7
+ data.tar.gz: 54bcfbb2d74a8f6e7c2079074716051d90369248b175a7f1a6fff434a808a4d2d4e41da24b484729b745012a751d3c982eb56f06ec3df24765a2cd0e55c87feb
@@ -1,3 +1,7 @@
1
+ # v4.16.0
2
+ * Add ssl_certificate option to allow certs to be provided as strings (helpful in heroku)
3
+ * Add `Conjur::Configuration#apply_cert_config!` method to add certs from `#cert_file` and `#ssl_certificate`
4
+ to the default cert store.
1
5
  # v4.15.0
2
6
  * Extensive documentation improvements
3
7
  * A few additional methoods, for example `Conjur::API#public_key_names`.
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Conjur
21
21
  class API
22
- VERSION = "4.15.0"
22
+ VERSION = "4.16.0"
23
23
  end
24
24
  end
@@ -18,6 +18,8 @@
18
18
  # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19
19
  # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
20
  #
21
+
22
+ require 'set'
21
23
  module Conjur
22
24
 
23
25
  class << self
@@ -388,8 +390,42 @@ module Conjur
388
390
  # @return [String, nil] path to the certificate file, or nil if you aren't using one.
389
391
  add_option :cert_file
390
392
 
393
+ # @!attribute ssl_certificate
394
+ #
395
+ # Contents of a certificate file. This can be used instead of :cert_file in environments like Heroku where you
396
+ # can't use a certificate file.
397
+ #
398
+ # This option overrides the value of {#cert_file} if both are given, and issues a warning.
399
+ #
400
+ # @see cert_file
401
+ add_option :ssl_certificate
402
+
403
+
404
+
405
+ # Add the certificate configured by the {#ssl_certificate} and {#cert_file} options to the certificate
406
+ # store used by Conjur clients.
407
+ #
408
+ # @param [OpenSSL::X509::Store] store the certificate store that the certificate will be installed in.
409
+ # @return [Boolean] whether a certificate was added to the store.
410
+ def apply_cert_config! store=OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE
411
+ if ssl_certificate
412
+ add_cert_string store, ssl_certificate
413
+ elsif cert_file
414
+ store.add_file cert_file
415
+ else
416
+ return false
417
+ end
418
+ true
419
+ end
420
+
391
421
  private
392
422
 
423
+ def add_cert_string store, str
424
+ store.add_cert OpenSSL::X509::Certificate.new str
425
+ rescue OpenSSL::X509::StoreError => ex
426
+ raise ex unless ex.message == 'cert already in hash table'
427
+ end
428
+
393
429
  def global_service_url(service_name, service_port_offset)
394
430
  if appliance_url
395
431
  URI.join(appliance_url + '/', service_name).to_s
@@ -428,5 +464,6 @@ module Conjur
428
464
  def herokuize name
429
465
  name.downcase.gsub(/[^a-z0-9\-]/, '-')
430
466
  end
467
+
431
468
  end
432
469
  end
@@ -213,4 +213,90 @@ describe Conjur::Configuration do
213
213
  end
214
214
  end
215
215
  end
216
+
217
+ describe "apply_cert_config!" do
218
+ subject{ Conjur.configuration.apply_cert_config! }
219
+
220
+ let(:store){ double('default store') }
221
+
222
+
223
+ before do
224
+ stub_const 'OpenSSL::SSL::SSLContext::DEFAULT_CERT_STORE', store
225
+ allow_any_instance_of(Conjur::Configuration).to receive(:ssl_certificate).and_return ssl_certificate
226
+ allow_any_instance_of(Conjur::Configuration).to receive(:cert_file).and_return cert_file
227
+
228
+ end
229
+
230
+ context "when neither cert_file or ssl_certificate is present" do
231
+ let(:cert_file){ nil }
232
+ let(:ssl_certificate){ nil }
233
+
234
+ it 'does nothing to the store' do
235
+ expect(store).to_not receive(:add_file)
236
+ expect(store).to_not receive(:add_cert)
237
+ expect(subject).to be_falsey
238
+ end
239
+ end
240
+
241
+ context 'when both are given' do
242
+ let(:cert_file){ '/path/to/cert.pem' }
243
+ let(:ssl_certificate){ 'certificate contents' }
244
+ let(:cert){ double('certificate') }
245
+ it 'calls store.add_cert with a certificate created from ssl_certificate' do
246
+ expect(OpenSSL::X509::Certificate).to receive(:new).with(ssl_certificate).once.and_return cert
247
+ expect(store).to receive(:add_cert).once.with(cert)
248
+ expect(subject).to be_truthy
249
+ end
250
+ end
251
+
252
+ context 'when cert_file is given and ssl_certificate is not' do
253
+ let(:cert_file){ '/path/to/cert.pem' }
254
+ let(:ssl_certificate){ nil }
255
+ it 'calls store.add_file with cert_file' do
256
+ expect(store).to receive(:add_file).with(cert_file).once
257
+ expect(subject).to be_truthy
258
+ end
259
+ end
260
+
261
+ context 'when ssl_certificate is given' do
262
+ let(:cert_file){ nil }
263
+ let(:ssl_certificate){ 'certificate contents' }
264
+ let(:cert){ double('cert') }
265
+
266
+ before do
267
+ expect(OpenSSL::X509::Certificate).to receive(:new).with(ssl_certificate).at_least(:once).and_return cert
268
+ end
269
+
270
+ it 'calls store.add_cert with a certificate created from ssl_certificate' do
271
+ expect(store).to receive(:add_cert).with(cert).once
272
+ expect(subject).to be_truthy
273
+ end
274
+
275
+ it 'rescues from a StoreError with message "cert already in hash tabble"' do
276
+ expect(store).to receive(:add_cert).with(cert).once.and_raise(OpenSSL::X509::StoreError.new('cert already in hash table'))
277
+ expect(subject).to be_truthy
278
+ end
279
+
280
+
281
+ it 'does not rescue from other exceptions' do
282
+ expect(store).to receive(:add_cert).with(cert).once.and_raise(OpenSSL::X509::StoreError.new('some other message'))
283
+ expect{subject}.to raise_exception
284
+ expect(store).to receive(:add_cert).with(cert).once.and_raise(ArgumentError.new('bad news'))
285
+ expect{subject}.to raise_exception
286
+ end
287
+ end
288
+
289
+ context 'when given a store argument' do
290
+ let(:cert_file){ '/path/to/cert.pem' }
291
+ let(:ssl_certificate){ nil }
292
+ let(:alt_store){ double('alt store') }
293
+ subject{ Conjur.configuration.apply_cert_config! alt_store }
294
+
295
+ it 'uses that store instead' do
296
+ expect(alt_store).to receive(:add_file).with(cert_file).once
297
+ expect(subject).to be_truthy
298
+ end
299
+ end
300
+
301
+ end
216
302
  end
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.15.0
4
+ version: 4.16.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-23 00:00:00.000000000 Z
12
+ date: 2015-04-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client