1 require 'spec_helper_acceptance'
3 PUPPETLABS_GPG_KEY_SHORT_ID = '4BD6EC30'
4 PUPPETLABS_GPG_KEY_LONG_ID = '1054B7A24BD6EC30'
5 PUPPETLABS_GPG_KEY_FINGERPRINT = '47B320EB4C7C375AA9DAE1A01054B7A24BD6EC30'
6 PUPPETLABS_APT_URL = 'apt.puppetlabs.com'
7 PUPPETLABS_GPG_KEY_FILE = 'pubkey.gpg'
8 CENTOS_GPG_KEY_SHORT_ID = 'C105B9DE'
9 CENTOS_GPG_KEY_LONG_ID = '0946FCA2C105B9DE'
10 CENTOS_GPG_KEY_FINGERPRINT = 'C1DAC52D1664E8A4386DBA430946FCA2C105B9DE'
11 CENTOS_REPO_URL = 'ftp.cvut.cz/centos'
12 CENTOS_GPG_KEY_FILE = 'RPM-GPG-KEY-CentOS-6'
14 SHOULD_NEVER_EXIST_ID = '4BD6EC30'
16 KEY_CHECK_COMMAND = "apt-key adv --list-keys --with-colons --fingerprint | grep "
17 PUPPETLABS_KEY_CHECK_COMMAND = "#{KEY_CHECK_COMMAND} #{PUPPETLABS_GPG_KEY_FINGERPRINT}"
18 CENTOS_KEY_CHECK_COMMAND = "#{KEY_CHECK_COMMAND} #{CENTOS_GPG_KEY_FINGERPRINT}"
22 # Delete twice to make sure everything is cleaned
23 # up after the short key collision
24 shell("apt-key del #{PUPPETLABS_GPG_KEY_SHORT_ID}",
25 :acceptable_exit_codes => [0,1,2])
26 shell("apt-key del #{PUPPETLABS_GPG_KEY_SHORT_ID}",
27 :acceptable_exit_codes => [0,1,2])
30 describe 'default options' do
32 '32bit key id' => '4BD6EC30',
33 '64bit key id' => '1054B7A24BD6EC30',
34 '160bit key fingerprint' => '47B320EB4C7C375AA9DAE1A01054B7A24BD6EC30',
35 '32bit lowercase key id' => '4bd6ec30',
36 '64bit lowercase key id' => '1054b7a24bd6ec30',
37 '160bit lowercase key fingerprint' => '47b320eb4c7c375aa9dae1a01054b7a24bd6ec30',
38 '0x formatted 32bit key id' => '0x4BD6EC30',
39 '0x formatted 64bit key id' => '0x1054B7A24BD6EC30',
40 '0x formatted 160bit key fingerprint' => '0x47B320EB4C7C375AA9DAE1A01054B7A24BD6EC30',
41 '0x formatted 32bit lowercase key id' => '0x4bd6ec30',
42 '0x formatted 64bit lowercase key id' => '0x1054b7a24bd6ec30',
43 '0x formatted 160bit lowercase key fingerprint' => '0x47b320eb4c7c375aa9dae1a01054b7a24bd6ec30',
46 key_versions.each do |key, value|
50 apt_key { 'puppetlabs':
56 apply_manifest(pp, :catch_failures => true)
57 apply_manifest(pp, :catch_changes => true)
58 shell(PUPPETLABS_KEY_CHECK_COMMAND)
63 context 'invalid length key id' do
66 apt_key { 'puppetlabs':
67 id => '4B7A24BD6EC30',
71 apply_manifest(pp, :expect_failures => true) do |r|
72 expect(r.stderr).to match(/Valid values match/)
78 describe 'ensure =>' do
83 id => '#{CENTOS_GPG_KEY_LONG_ID}',
88 # Install the key first
89 shell("apt-key adv --keyserver keyserver.ubuntu.com \
90 --recv-keys #{CENTOS_GPG_KEY_FINGERPRINT}")
91 shell(CENTOS_KEY_CHECK_COMMAND)
93 # Time to remove it using Puppet
94 apply_manifest(pp, :catch_failures => true)
95 apply_manifest(pp, :catch_failures => true)
97 shell(CENTOS_KEY_CHECK_COMMAND,
98 :acceptable_exit_codes => [1])
100 shell("apt-key adv --keyserver keyserver.ubuntu.com \
101 --recv-keys #{CENTOS_GPG_KEY_FINGERPRINT}")
105 context 'absent, added with long key', :unless => (fact('operatingsystem') == 'Debian' and fact('operatingsystemmajrelease') == '6') do
108 apt_key { 'puppetlabs':
109 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
114 # Install the key first
115 shell("apt-key adv --keyserver keyserver.ubuntu.com \
116 --recv-keys #{PUPPETLABS_GPG_KEY_LONG_ID}")
117 shell(PUPPETLABS_KEY_CHECK_COMMAND)
119 # Time to remove it using Puppet
120 apply_manifest(pp, :catch_failures => true)
121 apply_manifest(pp, :catch_failures => true)
123 shell(PUPPETLABS_KEY_CHECK_COMMAND,
124 :acceptable_exit_codes => [1])
129 describe 'content =>' do
130 context 'puppetlabs gpg key' do
133 apt_key { 'puppetlabs':
134 id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}',
136 content => "-----BEGIN PGP PUBLIC KEY BLOCK-----
137 Version: GnuPG v1.4.12 (GNU/Linux)
138 Comment: GPGTools - http://gpgtools.org
140 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
195 -----END PGP PUBLIC KEY BLOCK-----",
199 apply_manifest(pp, :catch_failures => true)
200 apply_manifest(pp, :catch_failures => true)
201 shell(PUPPETLABS_KEY_CHECK_COMMAND)
205 context 'bogus key' do
208 apt_key { 'puppetlabs':
209 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
211 content => 'For posterity: such content, much bogus, wow',
215 apply_manifest(pp, :expect_failures => true) do |r|
216 expect(r.stderr).to match(/no valid OpenPGP data found/)
222 describe 'server =>' do
223 context 'pgp.mit.edu' do
226 apt_key { 'puppetlabs':
227 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
229 server => 'pgp.mit.edu',
233 apply_manifest(pp, :catch_failures => true)
234 apply_manifest(pp, :catch_failures => true)
235 shell(PUPPETLABS_KEY_CHECK_COMMAND)
239 context 'hkp://pgp.mit.edu:80' do
242 apt_key { 'puppetlabs':
243 id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}',
245 server => 'hkp://pgp.mit.edu:80',
249 apply_manifest(pp, :catch_failures => true)
250 apply_manifest(pp, :catch_failures => true)
251 shell(PUPPETLABS_KEY_CHECK_COMMAND)
255 context 'nonexistant.key.server' do
258 apt_key { 'puppetlabs':
259 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
261 server => 'nonexistant.key.server',
265 apply_manifest(pp, :expect_failures => true) do |r|
266 expect(r.stderr).to match(/(Host not found|Couldn't resolve host)/)
271 context 'key server start with dot' do
274 apt_key { 'puppetlabs':
275 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
277 server => '.pgp.key.server',
281 apply_manifest(pp, :expect_failures => true) do |r|
282 expect(r.stderr).to match(/Invalid value \".pgp.key.server\"/)
288 describe 'source =>' do
292 apt_key { 'puppetlabs':
293 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
295 source => 'http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}',
299 apply_manifest(pp, :catch_failures => true)
300 apply_manifest(pp, :catch_failures => true)
301 shell(PUPPETLABS_KEY_CHECK_COMMAND)
304 it 'fails with a 404' do
306 apt_key { 'puppetlabs':
307 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
309 source => 'http://#{PUPPETLABS_APT_URL}/herpderp.gpg',
313 apply_manifest(pp, :expect_failures => true) do |r|
314 expect(r.stderr).to match(/404 Not Found/)
318 it 'fails with a socket error' do
320 apt_key { 'puppetlabs':
321 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
323 source => 'http://apt.puppetlabss.com/herpderp.gpg',
327 apply_manifest(pp, :expect_failures => true) do |r|
328 expect(r.stderr).to match(/could not resolve/)
335 shell("apt-key del #{CENTOS_GPG_KEY_LONG_ID}",
336 :acceptable_exit_codes => [0,1,2])
341 apt_key { 'CentOS 6':
342 id => '#{CENTOS_GPG_KEY_LONG_ID}',
344 source => 'ftp://#{CENTOS_REPO_URL}/#{CENTOS_GPG_KEY_FILE}',
348 apply_manifest(pp, :catch_failures => true)
349 apply_manifest(pp, :catch_failures => true)
350 shell(CENTOS_KEY_CHECK_COMMAND)
353 it 'fails with a 550' do
355 apt_key { 'CentOS 6':
356 id => '#{SHOULD_NEVER_EXIST_ID}',
358 source => 'ftp://#{CENTOS_REPO_URL}/herpderp.gpg',
362 apply_manifest(pp, :expect_failures => true) do |r|
363 expect(r.stderr).to match(/550 Failed to open/)
367 it 'fails with a socket error' do
369 apt_key { 'puppetlabs':
370 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
372 source => 'ftp://apt.puppetlabss.com/herpderp.gpg',
376 apply_manifest(pp, :expect_failures => true) do |r|
377 expect(r.stderr).to match(/could not resolve/)
382 context 'https://' do
385 apt_key { 'puppetlabs':
386 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
388 source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}',
392 apply_manifest(pp, :catch_failures => true)
393 apply_manifest(pp, :catch_failures => true)
394 shell(PUPPETLABS_KEY_CHECK_COMMAND)
397 it 'fails with a 404' do
399 apt_key { 'puppetlabs':
400 id => '#{SHOULD_NEVER_EXIST_ID}',
402 source => 'https://#{PUPPETLABS_APT_URL}/herpderp.gpg',
406 apply_manifest(pp, :expect_failures => true) do |r|
407 expect(r.stderr).to match(/404 Not Found/)
411 it 'fails with a socket error' do
413 apt_key { 'puppetlabs':
414 id => '#{SHOULD_NEVER_EXIST_ID}',
416 source => 'https://apt.puppetlabss.com/herpderp.gpg',
420 apply_manifest(pp, :expect_failures => true) do |r|
421 expect(r.stderr).to match(/could not resolve/)
426 context '/path/that/exists' do
428 shell("curl -o /tmp/puppetlabs-pubkey.gpg \
429 http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}")
433 shell('rm /tmp/puppetlabs-pubkey.gpg')
438 apt_key { 'puppetlabs':
441 source => '/tmp/puppetlabs-pubkey.gpg',
445 apply_manifest(pp, :catch_failures => true)
446 apply_manifest(pp, :catch_failures => true)
447 shell(PUPPETLABS_KEY_CHECK_COMMAND)
451 context '/path/that/does/not/exist' do
454 apt_key { 'puppetlabs':
455 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
457 source => '/tmp/totally_bogus.file',
461 apply_manifest(pp, :expect_failures => true) do |r|
462 expect(r.stderr).to match(/does not exist/)
467 context '/path/that/exists/with/bogus/content' do
469 shell('echo "here be dragons" > /tmp/fake-key.gpg')
473 shell('rm /tmp/fake-key.gpg')
477 apt_key { 'puppetlabs':
478 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
480 source => '/tmp/fake-key.gpg',
484 apply_manifest(pp, :expect_failures => true) do |r|
485 expect(r.stderr).to match(/no valid OpenPGP data found/)
491 describe 'keyserver_options =>' do
495 apt_key { 'puppetlabs':
496 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
498 keyserver_options => 'debug',
502 apply_manifest(pp, :catch_failures => true)
503 apply_manifest(pp, :catch_failures => true)
504 shell(PUPPETLABS_KEY_CHECK_COMMAND)
507 it 'fails on invalid options' do
509 apt_key { 'puppetlabs':
510 id => '#{PUPPETLABS_GPG_KEY_LONG_ID}',
512 keyserver_options => 'this is totally bonkers',
516 shell("apt-key del #{PUPPETLABS_GPG_KEY_FINGERPRINT}", :acceptable_exit_codes => [0,1,2])
517 apply_manifest(pp, :expect_failures => true) do |r|
518 expect(r.stderr).to match(/--keyserver-options this is totally/)