berkshelf 5.2.0 → 5.3.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: 5089b7006471b9e1a535ab4fc5f3ee1b83ae6114
4
- data.tar.gz: 15c5ac0f94f60ea0d741975e13ed4af81fa5ef70
3
+ metadata.gz: ca3e18fe34db1ef6247c982bfcdee59145909ace
4
+ data.tar.gz: 2349d6fd268fe58dd5f28096bbd16aa57f8a4d57
5
5
  SHA512:
6
- metadata.gz: a6a0945ca8000eb04ae6d381c04235ad9c9657635ba6eda6453134207421a8054df09407972988750ff89b5d93d183e2f2a966933eabc977471672ffd07ab530
7
- data.tar.gz: ae1cfadeee18dda60605775d86d31720524636eb4e600a13d1802a75e4fa955621ba37463af8dc5b41c9537b5028d2274eda88e3a4c398dfae75a59c71dfafe3
6
+ metadata.gz: 670473789eb3606bc9e867fbb6f28ce2858bfa1ef0092862627043008ffb7b807580bcfa06c3a01fb111a847144f9ff262041f93e0cc103e3b2db2a944101ecf
7
+ data.tar.gz: 0beb850938db36494f3ed5b272c6974706c57731cacc74ec62578a5c9f821fad1737dadbdd91a5f30f28be791b0b9781de9c685bcc73b121ad2202c1d7f3698e
@@ -41,6 +41,9 @@ matrix:
41
41
  - rvm: 2.2.5
42
42
  - rvm: 2.3.1
43
43
  - rvm: ruby-head
44
+ - rvm: 2.3.1
45
+ before_install:
46
+ rm Gemfile.lock
44
47
  # - rvm: 2.2.5
45
48
  # before_install:
46
49
  # # Failures in the berkshelf-api gemspec were happening with bundler 1.8
@@ -1,7 +1,15 @@
1
1
  # Change Log
2
2
 
3
- ## [5.2.0](https://github.com/berkshelf/berkshelf/tree/5.2.0) (2016-11-07)
4
- [Full Changelog](https://github.com/berkshelf/berkshelf/compare/v5.1.0...5.2.0)
3
+ ## [5.3.0](https://github.com/berkshelf/berkshelf/tree/5.3.0) (2016-12-15)
4
+ [Full Changelog](https://github.com/berkshelf/berkshelf/compare/v5.2.0...5.3.0)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - Add SSLPolicy class that will use chefdk trusted certs path [\#1640](https://github.com/berkshelf/berkshelf/pull/1640) ([afiune](https://github.com/afiune))
9
+ - Add alternative way to run tests [\#1626](https://github.com/berkshelf/berkshelf/pull/1626) ([gliptak](https://github.com/gliptak))
10
+
11
+ ## [v5.2.0](https://github.com/berkshelf/berkshelf/tree/v5.2.0) (2016-11-07)
12
+ [Full Changelog](https://github.com/berkshelf/berkshelf/compare/v5.1.0...v5.2.0)
5
13
 
6
14
  **Merged pull requests:**
7
15
 
@@ -36,10 +36,14 @@ Bundler will install all gems and their dependencies required for testing and de
36
36
 
37
37
  ### Running unit (RSpec) and acceptance (Cucumber) tests
38
38
 
39
- We use Chef Zero - an in-memory Chef Server for running tests. It is automatically managed by the Specs and Cukes. Simply run:
39
+ We use Chef Zero - an in-memory Chef Server for running tests. It is automatically managed by the Specs and Cukes. Run:
40
40
 
41
41
  $ bundle exec guard start
42
42
 
43
+ or
44
+
45
+ $ bundle exec thor spec:ci
46
+
43
47
  See [here](https://github.com/tdegrunt/vagrant-chef-server-bootstrap) for a
44
48
  quick way to get a testing chef server up.
45
49
 
@@ -20,7 +20,7 @@ GIT
20
20
  PATH
21
21
  remote: .
22
22
  specs:
23
- berkshelf (5.2.0)
23
+ berkshelf (5.3.0)
24
24
  addressable (~> 2.3, >= 2.3.4)
25
25
  berkshelf-api-client (>= 2.0.2, < 4.0)
26
26
  buff-config (~> 2.0)
@@ -35,7 +35,7 @@ PATH
35
35
  retryable (~> 2.0)
36
36
  ridley (~> 5.0)
37
37
  solve (> 2.0, < 4.0)
38
- thor (~> 0.19)
38
+ thor (~> 0.19, < 0.19.2)
39
39
 
40
40
  GEM
41
41
  remote: https://rubygems.org/
@@ -49,7 +49,7 @@ GEM
49
49
  addressable (2.4.0)
50
50
  archive (0.0.6)
51
51
  ffi (~> 1.9.3)
52
- artifactory (2.5.0)
52
+ artifactory (2.5.1)
53
53
  aruba (0.14.2)
54
54
  childprocess (~> 0.5.6)
55
55
  contracts (~> 0.9)
@@ -80,7 +80,7 @@ GEM
80
80
  celluloid-io (0.16.2)
81
81
  celluloid (>= 0.16.0)
82
82
  nio4r (>= 1.1.0)
83
- chef-config (12.15.19)
83
+ chef-config (12.16.42)
84
84
  addressable
85
85
  fuzzyurl
86
86
  mixlib-config (~> 2.0)
@@ -187,10 +187,10 @@ GEM
187
187
  guard (~> 2.0)
188
188
  guard-compat (~> 1.0)
189
189
  spork (>= 0.8.4)
190
- hashdiff (0.3.0)
190
+ hashdiff (0.3.1)
191
191
  hashie (3.4.6)
192
192
  hitimes (1.2.4)
193
- http (2.0.3)
193
+ http (2.1.0)
194
194
  addressable (~> 2.3)
195
195
  http-cookie (~> 1.0)
196
196
  http-form_data (~> 1.0.1)
@@ -219,7 +219,7 @@ GEM
219
219
  mixlib-authentication (1.4.1)
220
220
  mixlib-log
221
221
  mixlib-config (2.2.4)
222
- mixlib-install (2.1.6)
222
+ mixlib-install (2.1.7)
223
223
  artifactory
224
224
  mixlib-shellout
225
225
  mixlib-versioning
@@ -227,7 +227,7 @@ GEM
227
227
  mixlib-log (1.7.1)
228
228
  mixlib-shellout (2.2.7)
229
229
  mixlib-versioning (1.1.0)
230
- molinillo (0.5.3)
230
+ molinillo (0.5.4)
231
231
  msgpack (1.0.2)
232
232
  multi_json (1.12.1)
233
233
  multi_test (0.1.2)
@@ -253,12 +253,12 @@ GEM
253
253
  multi_json (~> 1.3)
254
254
  multi_xml (~> 0.5)
255
255
  rack (>= 1.2, < 3)
256
- octokit (4.4.1)
257
- sawyer (~> 0.7.0, >= 0.5.3)
256
+ octokit (4.6.2)
257
+ sawyer (~> 0.8.0, >= 0.5.3)
258
258
  overcommit (0.37.0)
259
259
  childprocess (~> 0.5.8)
260
260
  iniparse (~> 1.4)
261
- parser (2.3.1.4)
261
+ parser (2.3.3.0)
262
262
  ast (~> 2.2)
263
263
  powerpack (0.1.1)
264
264
  pry (0.10.4)
@@ -320,17 +320,17 @@ GEM
320
320
  ruby-progressbar (1.8.1)
321
321
  ruby_dep (1.5.0)
322
322
  safe_yaml (1.0.4)
323
- sawyer (0.7.0)
324
- addressable (>= 2.3.5, < 2.5)
325
- faraday (~> 0.8, < 0.10)
323
+ sawyer (0.8.1)
324
+ addressable (>= 2.3.5, < 2.6)
325
+ faraday (~> 0.8, < 1.0)
326
326
  semverse (2.0.0)
327
327
  shellany (0.0.1)
328
328
  slop (3.6.0)
329
- solve (3.0.1)
330
- molinillo (~> 0.4)
329
+ solve (3.1.0)
330
+ molinillo (>= 0.5)
331
331
  semverse (>= 1.1, < 3.0)
332
332
  spork (0.9.2)
333
- test-kitchen (1.13.2)
333
+ test-kitchen (1.14.0)
334
334
  mixlib-install (>= 1.2, < 3.0)
335
335
  mixlib-shellout (>= 1.2, < 3.0)
336
336
  net-scp (~> 1.1)
data/README.md CHANGED
@@ -31,7 +31,7 @@ $ gem install berkshelf
31
31
 
32
32
  ## Usage
33
33
 
34
- See [berkshelf.com](http://berkshelf.com) for up-to-date usage instructions.
34
+ See [docs.chef.io](https://docs.chef.io/berkshelf.html) for up-to-date usage instructions.
35
35
 
36
36
  ## Supported Platforms
37
37
 
@@ -42,7 +42,7 @@ Gem::Specification.new do |s|
42
42
  s.add_dependency 'retryable', '~> 2.0'
43
43
  s.add_dependency 'ridley', '~> 5.0'
44
44
  s.add_dependency 'solve', '> 2.0', '< 4.0'
45
- s.add_dependency 'thor', '~> 0.19'
45
+ s.add_dependency 'thor', '~> 0.19', '< 0.19.2'
46
46
  s.add_dependency 'octokit', '~> 4.0'
47
47
  s.add_dependency 'mixlib-archive', '~> 0.1'
48
48
  end
@@ -118,14 +118,25 @@ module Berkshelf
118
118
  @formatter ||= HumanFormatter.new
119
119
  end
120
120
 
121
+ def ssl_policy
122
+ @ssl_policy ||= SSLPolicy.new
123
+ end
124
+
121
125
  # @raise [Berkshelf::ChefConnectionError]
122
126
  def ridley_connection(options = {}, &block)
123
- ridley_options = options.slice(:ssl)
127
+ ssl_options = {}
128
+ ssl_options[:verify] = if options[:ssl_verify].nil?
129
+ Berkshelf.config.ssl.verify
130
+ else
131
+ options[:ssl_verify]
132
+ end
133
+ ssl_options[:cert_store] = ssl_policy.store if ssl_policy.store
124
134
 
135
+ ridley_options = options.slice(:ssl)
125
136
  ridley_options[:server_url] = options[:server_url] || Berkshelf.config.chef.chef_server_url
126
137
  ridley_options[:client_name] = options[:client_name] || Berkshelf.config.chef.node_name
127
138
  ridley_options[:client_key] = options[:client_key] || Berkshelf.config.chef.client_key
128
- ridley_options[:ssl] = { verify: (options[:ssl_verify].nil?) ? Berkshelf.config.ssl.verify : options[:ssl_verify]}
139
+ ridley_options[:ssl] = ssl_options
129
140
 
130
141
  unless ridley_options[:server_url].present?
131
142
  raise ChefConnectionError, 'Missing required attribute in your Berkshelf configuration: chef.server_url'
@@ -207,6 +218,7 @@ require_relative 'berkshelf/resolver'
207
218
  require_relative 'berkshelf/source'
208
219
  require_relative 'berkshelf/source_uri'
209
220
  require_relative 'berkshelf/validator'
221
+ require_relative 'berkshelf/ssl_policies'
210
222
 
211
223
  Ridley.logger = Berkshelf.logger
212
224
  Berkshelf.logger.level = Logger::WARN
@@ -106,6 +106,9 @@ module Berkshelf
106
106
  attribute 'chef.node_name',
107
107
  type: String,
108
108
  default: Berkshelf.chef_config.node_name
109
+ attribute 'chef.trusted_certs_dir',
110
+ type: String,
111
+ default: Berkshelf.chef_config.trusted_certs_dir
109
112
  attribute 'cookbook.copyright',
110
113
  type: String,
111
114
  default: Berkshelf.chef_config.cookbook_copyright
@@ -1,5 +1,6 @@
1
1
  require 'net/http'
2
2
  require 'mixlib/archive'
3
+ require 'berkshelf/ssl_policies'
3
4
 
4
5
  module Berkshelf
5
6
  class Downloader
@@ -14,6 +15,10 @@ module Berkshelf
14
15
  @berksfile = berksfile
15
16
  end
16
17
 
18
+ def ssl_policy
19
+ @ssl_policy ||= SSLPolicy.new
20
+ end
21
+
17
22
  # Download the given Berkshelf::Dependency. If the optional block is given,
18
23
  # the temporary path to the cookbook is yielded and automatically deleted
19
24
  # when the block returns. If no block is given, it is the responsibility of
@@ -61,11 +66,14 @@ module Berkshelf
61
66
  CommunityREST.new(remote_cookbook.location_path).download(name, version)
62
67
  when :chef_server
63
68
  # @todo Dynamically get credentials for remote_cookbook.location_path
69
+ ssl_options = {verify: Berkshelf::Config.instance.ssl.verify}
70
+ ssl_options[:cert_store] = ssl_policy.store if ssl_policy.store
71
+
64
72
  credentials = {
65
73
  server_url: remote_cookbook.location_path,
66
74
  client_name: Berkshelf::Config.instance.chef.node_name,
67
75
  client_key: Berkshelf::Config.instance.chef.client_key,
68
- ssl: Berkshelf::Config.instance.ssl
76
+ ssl: ssl_options
69
77
  }
70
78
  # @todo Something scary going on here - getting an instance of Kitchen::Logger from test-kitchen
71
79
  # https://github.com/opscode/test-kitchen/blob/master/lib/kitchen.rb#L99
@@ -1,4 +1,6 @@
1
1
  require 'berkshelf/api-client'
2
+ require 'berkshelf/ssl_policies'
3
+ require 'openssl'
2
4
 
3
5
  module Berkshelf
4
6
  class Source
@@ -12,11 +14,18 @@ module Berkshelf
12
14
  @universe = nil
13
15
  end
14
16
 
17
+ def ssl_policy
18
+ @ssl_policy ||= SSLPolicy.new
19
+ end
20
+
15
21
  def api_client
16
22
  @api_client ||= begin
23
+ ssl_options = {verify: Berkshelf::Config.instance.ssl.verify}
24
+ ssl_options[:cert_store] = ssl_policy.store if ssl_policy.store
25
+
17
26
  if source == :chef_server
18
27
  APIClient.chef_server(
19
- ssl: Berkshelf::Config.instance.ssl,
28
+ ssl: ssl_options,
20
29
  timeout: api_timeout,
21
30
  open_timeout: [(api_timeout / 10), 3].max,
22
31
  client_name: Berkshelf::Config.instance.chef.node_name,
@@ -0,0 +1,40 @@
1
+ require 'openssl'
2
+
3
+ module Berkshelf
4
+ class SSLPolicy
5
+
6
+ # @return [Store]
7
+ # Holds trusted CA certificates used to verify peer certificates
8
+ attr_reader :store
9
+
10
+ def initialize
11
+ @store = OpenSSL::X509::Store.new.tap do |store|
12
+ store.set_default_paths
13
+ end
14
+
15
+ set_custom_certs if ::File.exist?(trusted_certs_dir)
16
+ end
17
+
18
+ def add_trusted_cert(cert)
19
+ @store.add_cert(cert)
20
+ rescue OpenSSL::X509::StoreError => e
21
+ raise e unless e.message == 'cert already in hash table'
22
+ end
23
+
24
+ def trusted_certs_dir
25
+ config_dir = Berkshelf.config.chef.trusted_certs_dir.to_s
26
+ if config_dir.empty? || !::File.exist?(config_dir)
27
+ File.join(ENV['HOME'], '.chef', 'trusted_certs')
28
+ else
29
+ config_dir
30
+ end
31
+ end
32
+
33
+ def set_custom_certs
34
+ ::Dir.glob("#{trusted_certs_dir}/" "{*.crt,*.pem}").each do |cert|
35
+ cert = OpenSSL::X509::Certificate.new(IO.read(cert))
36
+ add_trusted_cert(cert)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Berkshelf
2
- VERSION = "5.2.0"
2
+ VERSION = "5.3.0"
3
3
  end
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDkjCCAnoCCQDihI8kxGYTFTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
3
+ VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMRAwDgYDVQQKEwdZb3VD
4
+ b3JwMRMwEQYDVQQLEwpPcGVyYXRpb25zMRYwFAYDVQQDEw1leGFtcGxlLmxvY2Fs
5
+ MR0wGwYJKoZIhvcNAQkBFg5tZUBleGFtcGxlLmNvbTAeFw0xMzEwMTcxODAxMzVa
6
+ Fw0yMzEwMTUxODAxMzVaMIGKMQswCQYDVQQGEwJVUzELMAkGA1UECBMCV0ExEDAO
7
+ BgNVBAcTB1NlYXR0bGUxEDAOBgNVBAoTB1lvdUNvcnAxEzARBgNVBAsTCk9wZXJh
8
+ dGlvbnMxFjAUBgNVBAMTDWV4YW1wbGUubG9jYWwxHTAbBgkqhkiG9w0BCQEWDm1l
9
+ QGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyKBo
10
+ U+Bdni0xZK/NCzdLdi2X+TyW5eahbYMx+r1GDcVqCICvrthBCVLVFsQ8rvOHwTPi
11
+ AxQJGxb9TLSXRgXQSlH6FLjIUceuOtpan3qYVJ1v7AxY4DgNvYBpbtJz5MQedJnT
12
+ g2F+rXzkwaD6CWBqWHeGU0oP3r7bq1AMD6XEsK2w2/zHtG7TEnL45ARv1PsyrU5M
13
+ ZAW/XyoMyq1k2Lpv7YR5kAvTq1+4RSt/it2RFE7R0AVbaQ0MeAnllfySiHHHlaOT
14
+ FVd/qPSiGISxsUmmzA3Z08+0sfJwkrnJXbLscCBYndd7gMGgtczGjJtul0Ch3GFa
15
+ /Pn5McjwF272+usJ1wIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQCzPePWifWNECsG
16
+ nL8on1AtFMkczE1/pdRS4YUl/Tc926MpezptSja8rL31+4Bom37/wYPG7HygtAQl
17
+ R4FHpAtuqJKPOfjUmDNsIXRFnytrnflTpctDu/Nbj4PDCy01k/sTDUQt+s+lEBL8
18
+ M8ArmfLZ8PCfAwnXmJQ5rggDFKqegjt6z1RsSglbMiASE7+KkpBnzaqH6fET6IQz
19
+ WgAjv6WdRfwgfJjOTSX4XMpCSet9KaWmXExKrxiVng2Uu6E+ShVAyKaGMuc1B7VA
20
+ oxnnVaVapFv5lOWucQr4KkC7EgaUZnyt8duOc8+Yvd+y3Xd2dcHUnmegRxly4jRV
21
+ /lXbFAUb
22
+ -----END CERTIFICATE-----
@@ -4,6 +4,8 @@ def windows?
4
4
  !!(RUBY_PLATFORM =~ /mswin|mingw|windows/)
5
5
  end
6
6
 
7
+ BERKS_SPEC_DATA = File.expand_path("../data", __FILE__)
8
+
7
9
  Spork.prefork do
8
10
  require 'rspec'
9
11
  require 'cleanroom/rspec'
@@ -1,43 +1,116 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Berkshelf::Downloader do
4
- let(:berksfile) { double('berksfile') }
5
- subject { described_class.new(berksfile) }
6
-
7
- describe "#download" do
8
- skip
9
- end
10
-
11
- describe "#try_download" do
12
- let(:remote_cookbook) { double('remote-cookbook') }
13
- let(:source) do
14
- source = double('source')
15
- allow(source).to receive(:cookbook) { remote_cookbook }
16
- source
17
- end
18
- let(:name) { "fake" }
19
- let(:version) { "1.0.0" }
20
-
21
- it "supports the 'opscode' location type" do
22
- allow(remote_cookbook).to receive(:location_type) { :opscode }
23
- allow(remote_cookbook).to receive(:location_path) { "http://api.opscode.com" }
24
- rest = double('community-rest')
25
- expect(Berkshelf::CommunityREST).to receive(:new).with("http://api.opscode.com") { rest }
26
- expect(rest).to receive(:download).with(name, version)
27
- subject.try_download(source, name, version)
3
+ module Berkshelf
4
+ describe Downloader do
5
+ let(:berksfile) do
6
+ double(Berksfile,
7
+ lockfile: lockfile,
8
+ dependencies: [],
9
+ )
28
10
  end
29
11
 
30
- it "supports the 'supermarket' location type" do
31
- allow(remote_cookbook).to receive(:location_type) { :supermarket }
32
- allow(remote_cookbook).to receive(:location_path) { "http://api.supermarket.com" }
33
- rest = double('community-rest')
34
- expect(Berkshelf::CommunityREST).to receive(:new).with("http://api.supermarket.com") { rest }
35
- expect(rest).to receive(:download).with(name, version)
36
- subject.try_download(source, name, version)
12
+ let(:lockfile) do
13
+ double(Lockfile,
14
+ graph: graph
15
+ )
37
16
  end
38
17
 
39
- it "supports the 'file_store' location type" do
18
+ let(:graph) { double(Lockfile::Graph, locks: {}) }
19
+ let(:self_signed_crt_path) { File.join(BERKS_SPEC_DATA, 'trusted_certs') }
20
+ let(:self_signed_crt) { OpenSSL::X509::Certificate.new(IO.read("#{self_signed_crt_path}/example.crt")) }
21
+ let(:cert_store) { OpenSSL::X509::Store.new.add_cert(self_signed_crt) }
22
+ let(:ssl_policy) { double(SSLPolicy, store: cert_store) }
23
+
24
+ subject { described_class.new(berksfile) }
25
+
26
+ describe "#download" do
40
27
  skip
41
28
  end
29
+
30
+ describe "#try_download" do
31
+ let(:remote_cookbook) { double('remote-cookbook') }
32
+ let(:source) do
33
+ source = double('source')
34
+ allow(source).to receive(:cookbook) { remote_cookbook }
35
+ source
36
+ end
37
+ let(:name) { "fake" }
38
+ let(:version) { "1.0.0" }
39
+
40
+ it "supports the 'opscode' location type" do
41
+ allow(remote_cookbook).to receive(:location_type) { :opscode }
42
+ allow(remote_cookbook).to receive(:location_path) { "http://api.opscode.com" }
43
+ rest = double('community-rest')
44
+ expect(CommunityREST).to receive(:new).with("http://api.opscode.com") { rest }
45
+ expect(rest).to receive(:download).with(name, version)
46
+ subject.try_download(source, name, version)
47
+ end
48
+
49
+ it "supports the 'supermarket' location type" do
50
+ allow(remote_cookbook).to receive(:location_type) { :supermarket }
51
+ allow(remote_cookbook).to receive(:location_path) { "http://api.supermarket.com" }
52
+ rest = double('community-rest')
53
+ expect(CommunityREST).to receive(:new).with("http://api.supermarket.com") { rest }
54
+ expect(rest).to receive(:download).with(name, version)
55
+ subject.try_download(source, name, version)
56
+ end
57
+
58
+ describe 'chef_server location type' do
59
+ let(:chef_server_url) { 'http://configured-chef-server/' }
60
+ let(:ridley_client) do
61
+ double(Ridley::Client,
62
+ cookbook: double('cookbook', download: "fake")
63
+ )
64
+ end
65
+ let(:chef_config) do
66
+ double(Ridley::Chef::Config,
67
+ node_name: 'fake-client',
68
+ client_key: 'client-key',
69
+ chef_server_url: chef_server_url,
70
+ validation_client_name: 'validator',
71
+ validation_key: 'validator.pem',
72
+ cookbook_copyright: 'user',
73
+ cookbook_email: 'user@example.com',
74
+ cookbook_license: 'apachev2',
75
+ trusted_certs_dir: self_signed_crt_path,
76
+ knife: {
77
+ chef_guard: false
78
+ }
79
+ )
80
+ end
81
+
82
+ let(:berkshelf_config) do
83
+ double(Config,
84
+ ssl: double(verify: true),
85
+ chef: chef_config
86
+ )
87
+ end
88
+
89
+ before do
90
+ allow(Berkshelf).to receive(:config).and_return(berkshelf_config)
91
+ allow(subject).to receive(:ssl_policy).and_return(ssl_policy)
92
+ allow(remote_cookbook).to receive(:location_type) { :chef_server }
93
+ allow(remote_cookbook).to receive(:location_path) { chef_server_url }
94
+ end
95
+
96
+ it "uses the berkshelf config and provides a custom cert_store" do
97
+ credentials = {
98
+ server_url: chef_server_url,
99
+ client_name: chef_config.node_name,
100
+ client_key: chef_config.client_key,
101
+ ssl: {
102
+ verify: berkshelf_config.ssl.verify,
103
+ cert_store: cert_store
104
+ }
105
+ }
106
+ expect(Ridley).to receive(:open).with(credentials) { ridley_client }
107
+ subject.try_download(source, name, version)
108
+ end
109
+ end
110
+
111
+ it "supports the 'file_store' location type" do
112
+ skip
113
+ end
114
+ end
42
115
  end
43
116
  end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe Berkshelf::SSLPolicy do
4
+ let(:self_signed_crt_path) { File.join(BERKS_SPEC_DATA, 'trusted_certs') }
5
+
6
+ let(:chef_config) do
7
+ double(Ridley::Chef::Config,
8
+ node_name: 'fake-client',
9
+ client_key: 'client-key',
10
+ chef_server_url: 'http://configured-chef-server/',
11
+ validation_client_name: 'validator',
12
+ validation_key: 'validator.pem',
13
+ cookbook_copyright: 'user',
14
+ cookbook_email: 'user@example.com',
15
+ cookbook_license: 'apachev2',
16
+ trusted_certs_dir: self_signed_crt_path,
17
+ knife: {
18
+ chef_guard: false
19
+ }
20
+ )
21
+ end
22
+
23
+ let(:berkshelf_config) do
24
+ double(Berkshelf::Config,
25
+ ssl: double(verify: true),
26
+ chef: chef_config
27
+ )
28
+ end
29
+
30
+ subject do
31
+ Berkshelf::SSLPolicy.new()
32
+ end
33
+
34
+ before do
35
+ allow(Berkshelf).to receive(:config).and_return(berkshelf_config)
36
+ end
37
+
38
+ describe '#initialize' do
39
+ it 'sets up the store' do
40
+ expect(subject.store.class).to be(OpenSSL::X509::Store)
41
+ end
42
+
43
+ it 'sets up custom certificates for chef' do
44
+ end
45
+ end
46
+
47
+ describe '#trusted_certs_dir' do
48
+ it 'uses the trusted_certs_dir from Berkshelf config' do
49
+ expect(subject.trusted_certs_dir).to eq(self_signed_crt_path)
50
+ end
51
+
52
+ context 'trusted_certs_dir in Berkshelf' do
53
+
54
+ context 'config is not set' do
55
+ before { allow(chef_config).to receive_messages(trusted_certs_dir: nil) }
56
+
57
+ it 'defaults to ~/.chef/trusted_certs' do
58
+ expect(subject.trusted_certs_dir).to eq(
59
+ File.join(ENV['HOME'], '.chef', 'trusted_certs')
60
+ )
61
+ end
62
+ end
63
+
64
+ context 'config is seti but does not exist' do
65
+ before { allow(chef_config).to receive_messages(trusted_certs_dir: '/fake') }
66
+
67
+ it 'defaults to ~/.chef/trusted_certs' do
68
+ expect(subject.trusted_certs_dir).to eq(
69
+ File.join(ENV['HOME'], '.chef', 'trusted_certs')
70
+ )
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -16,6 +16,10 @@ module Berkshelf
16
16
  end
17
17
 
18
18
  let(:graph) { double(Lockfile::Graph, locks: {}) }
19
+ let(:self_signed_crt_path) { File.join(BERKS_SPEC_DATA, 'trusted_certs') }
20
+ let(:self_signed_crt) { OpenSSL::X509::Certificate.new(IO.read("#{self_signed_crt_path}/example.crt")) }
21
+ let(:cert_store) { OpenSSL::X509::Store.new.add_cert(self_signed_crt) }
22
+ let(:ssl_policy) { double(SSLPolicy, store: cert_store) }
19
23
 
20
24
  subject { Uploader.new(berksfile) }
21
25
 
@@ -56,6 +60,7 @@ module Berkshelf
56
60
  cookbook_copyright: 'user',
57
61
  cookbook_email: 'user@example.com',
58
62
  cookbook_license: 'apachev2',
63
+ trusted_certs_dir: self_signed_crt_path,
59
64
  knife: {
60
65
  chef_guard: false
61
66
  }
@@ -81,6 +86,7 @@ module Berkshelf
81
86
 
82
87
  before do
83
88
  allow(Berkshelf).to receive(:config).and_return(berkshelf_config)
89
+ allow(Berkshelf).to receive(:ssl_policy).and_return(ssl_policy)
84
90
  end
85
91
 
86
92
  context 'when there is no value for :chef_server_url' do
@@ -123,7 +129,25 @@ module Berkshelf
123
129
  client_name: chef_config.node_name,
124
130
  client_key: chef_config.client_key,
125
131
  ssl: {
126
- verify: berkshelf_config.ssl.verify
132
+ verify: berkshelf_config.ssl.verify,
133
+ cert_store: cert_store
134
+ }
135
+ )
136
+ subject.run
137
+ end
138
+ end
139
+
140
+ context 'when ssl_verify: false is passed as an option' do
141
+ subject { Uploader.new(berksfile, ssl_verify: false) }
142
+
143
+ it 'uses the passed option' do
144
+ expect(Ridley).to receive(:open).with(
145
+ server_url: chef_config.chef_server_url,
146
+ client_name: chef_config.node_name,
147
+ client_key: chef_config.client_key,
148
+ ssl: {
149
+ verify: false,
150
+ cert_store: cert_store
127
151
  }
128
152
  )
129
153
  subject.run
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: berkshelf
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamie Winsor
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2016-11-07 00:00:00.000000000 Z
15
+ date: 2016-12-15 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: addressable
@@ -213,6 +213,9 @@ dependencies:
213
213
  - - "~>"
214
214
  - !ruby/object:Gem::Version
215
215
  version: '0.19'
216
+ - - "<"
217
+ - !ruby/object:Gem::Version
218
+ version: 0.19.2
216
219
  type: :runtime
217
220
  prerelease: false
218
221
  version_requirements: !ruby/object:Gem::Requirement
@@ -220,6 +223,9 @@ dependencies:
220
223
  - - "~>"
221
224
  - !ruby/object:Gem::Version
222
225
  version: '0.19'
226
+ - - "<"
227
+ - !ruby/object:Gem::Version
228
+ version: 0.19.2
223
229
  - !ruby/object:Gem::Dependency
224
230
  name: octokit
225
231
  requirement: !ruby/object:Gem::Requirement
@@ -373,6 +379,7 @@ files:
373
379
  - lib/berkshelf/shell.rb
374
380
  - lib/berkshelf/source.rb
375
381
  - lib/berkshelf/source_uri.rb
382
+ - lib/berkshelf/ssl_policies.rb
376
383
  - lib/berkshelf/thor.rb
377
384
  - lib/berkshelf/thor_ext.rb
378
385
  - lib/berkshelf/thor_ext/hash_with_indifferent_access.rb
@@ -383,6 +390,7 @@ files:
383
390
  - spec/config/berkshelf.pem
384
391
  - spec/config/knife.rb
385
392
  - spec/config/validator.pem
393
+ - spec/data/trusted_certs/example.crt
386
394
  - spec/fixtures/Berksfile
387
395
  - spec/fixtures/berksfiles/default
388
396
  - spec/fixtures/cookbook-path/jenkins-config/metadata.rb
@@ -445,6 +453,7 @@ files:
445
453
  - spec/unit/berkshelf/shell_spec.rb
446
454
  - spec/unit/berkshelf/source_spec.rb
447
455
  - spec/unit/berkshelf/source_uri_spec.rb
456
+ - spec/unit/berkshelf/ssl_policies_spec.rb
448
457
  - spec/unit/berkshelf/uploader_spec.rb
449
458
  - spec/unit/berkshelf/validator_spec.rb
450
459
  - spec/unit/berkshelf/visualizer_spec.rb
@@ -469,7 +478,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
469
478
  version: 2.0.0
470
479
  requirements: []
471
480
  rubyforge_project:
472
- rubygems_version: 2.5.1
481
+ rubygems_version: 2.6.8
473
482
  signing_key:
474
483
  specification_version: 4
475
484
  summary: Manages a Cookbook's, or an Application's, Cookbook dependencies
@@ -515,6 +524,7 @@ test_files:
515
524
  - spec/config/berkshelf.pem
516
525
  - spec/config/knife.rb
517
526
  - spec/config/validator.pem
527
+ - spec/data/trusted_certs/example.crt
518
528
  - spec/fixtures/Berksfile
519
529
  - spec/fixtures/berksfiles/default
520
530
  - spec/fixtures/cookbook-path/jenkins-config/metadata.rb
@@ -577,6 +587,7 @@ test_files:
577
587
  - spec/unit/berkshelf/shell_spec.rb
578
588
  - spec/unit/berkshelf/source_spec.rb
579
589
  - spec/unit/berkshelf/source_uri_spec.rb
590
+ - spec/unit/berkshelf/ssl_policies_spec.rb
580
591
  - spec/unit/berkshelf/uploader_spec.rb
581
592
  - spec/unit/berkshelf/validator_spec.rb
582
593
  - spec/unit/berkshelf/visualizer_spec.rb