iostreams 0.12.1 → 0.13.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: 0d18dafc30b8314925e4bc352ff146bcf39ec0c6
4
- data.tar.gz: 8fc00eda8c6a850f5e8abe6386718a483b04884c
3
+ metadata.gz: 712deef2bff987dadce811adaf19b3a98b51d26c
4
+ data.tar.gz: 58492c0c5e0cbaeadfa090dfef76b854eaa54b66
5
5
  SHA512:
6
- metadata.gz: 7d0c13bb7daa4480884ce323b229a0018ec37ded48aad8ad2c10502a085e14970d354de06306898fd989225b6aaaf3a2fc0fdee563c7bb3a7e7bf84413ab74ce
7
- data.tar.gz: 7b70b19a019542d1c400d7ef1e99622acc73342a07444402f7326c341496b6a92e5985e807dd811004135b5f30c806aaf9ccdbaadf80394a14a764e6fadfd862
6
+ metadata.gz: 4ad8a531db8ceac264448201aaf43422e0483b67e3abb4f35017d67119337d6579db39e390140b6c8ea5554f63723a355808b5b6f7c8d063c8a4d37a059e0430
7
+ data.tar.gz: 8d6a0767dc56adc16015578015c93646ef037a086aa7108a300ac9ccc7b460c452ea8f7395225d34c577584a4313de0c15a012b5a746e58236b1ab1280905f4e
@@ -36,8 +36,9 @@ module IOStreams
36
36
  parts = file_name.split('.')
37
37
  extensions = []
38
38
  while extension = parts.pop
39
- break unless @extensions[extension.to_sym]
40
- extensions.unshift(extension.to_sym)
39
+ sym = extension.downcase.to_sym
40
+ break unless @extensions[sym]
41
+ extensions.unshift(sym)
41
42
  end
42
43
  extensions << :file if extensions.size == 0
43
44
  extensions
@@ -122,7 +122,7 @@ module IOStreams
122
122
  # `SecureRandom.urlsafe_base64(128)`
123
123
  #
124
124
  # See `man gpg` for the remaining options
125
- def self.generate_key(name:, email:, comment: nil, passphrase: nil, key_type: 'RSA', key_length: 4096, subkey_type: 'RSA', subkey_length: key_length, expire_date: nil)
125
+ def self.generate_key(name:, email:, comment: nil, passphrase:, key_type: 'RSA', key_length: 4096, subkey_type: 'RSA', subkey_length: key_length, expire_date: nil)
126
126
  version_check
127
127
  params = ''
128
128
  params << "Key-Type: #{key_type}\n" if key_type
@@ -135,14 +135,16 @@ module IOStreams
135
135
  params << "Expire-Date: #{expire_date}\n" if expire_date
136
136
  params << "Passphrase: #{passphrase}\n" if passphrase
137
137
  params << '%commit'
138
- out, err, status = Open3.capture3("#{executable} --batch --gen-key", binmode: true, stdin_data: params)
139
- logger.debug { "IOStreams::Pgp.generate_key output:\n#{out}#{err}" } if logger
138
+ command = "#{executable} --batch --gen-key --no-tty --quiet"
139
+
140
+ out, err, status = Open3.capture3(command, binmode: true, stdin_data: params)
141
+ logger.debug { "IOStreams::Pgp.generate_key: #{command}\n#{err}#{out}" } if logger
140
142
  if status.success?
141
143
  if match = err.match(/gpg: key ([0-9A-F]+)\s+/)
142
144
  return match[1]
143
145
  end
144
146
  else
145
- raise(Pgp::Failure, "GPG Failed to generate key: #{out}#{err}")
147
+ raise(Pgp::Failure, "GPG Failed to generate key: #{err}#{out}")
146
148
  end
147
149
  end
148
150
 
@@ -162,21 +164,11 @@ module IOStreams
162
164
  # Default: false
163
165
  def self.delete_keys(email:, public: true, private: false)
164
166
  version_check
165
- cmd = "for i in `gpg --with-colons --fingerprint #{email} | grep \"^fpr\" | cut -d: -f10`; do\n"
166
- cmd << "#{executable} --batch --delete-secret-keys \"$i\" ;\n" if private
167
- cmd << "#{executable} --batch --delete-keys \"$i\" ;\n" if public
168
- cmd << 'done'
169
-
170
- out, err, status = Open3.capture3(cmd, binmode: true)
171
- logger.debug { "IOStreams::Pgp.delete_keys output:\n#{err}#{out}" } if logger
172
-
173
- if status.success?
174
- return false if err =~ /(not found|No public key)/i
175
- raise(Pgp::Failure, "GPG Failed to delete keys for #{email}:#{err}#{out}") if out.include?('error')
176
- true
177
- else
178
- raise(Pgp::Failure, "GPG Failed calling gpg to delete private keys for #{email}: #{err}#{out}")
179
- end
167
+ method_name = pgp_version.to_f >= 2.2 ? :delete_public_or_private_keys : :delete_public_or_private_keys_v1
168
+ status = false
169
+ status = send(method_name, email: email, private: true) if private
170
+ status = send(method_name, email: email, private: false) if public
171
+ status
180
172
  end
181
173
 
182
174
  # Returns [true|false] whether their is a key for the supplied email or key_id
@@ -197,22 +189,16 @@ module IOStreams
197
189
  # Returns [] if no keys were found.
198
190
  def self.list_keys(email: nil, key_id: nil, private: false)
199
191
  version_check
200
- cmd = private ? '--list-secret-keys' : '--list-keys'
201
- out, err, status = Open3.capture3("#{executable} #{cmd} #{email || key_id}", binmode: true)
202
- logger.debug { "IOStreams::Pgp.list_keys output:\n#{err}#{out}" } if logger
192
+ cmd = private ? '--list-secret-keys' : '--list-keys'
193
+ command = "#{executable} #{cmd} #{email || key_id}"
194
+
195
+ out, err, status = Open3.capture3(command, binmode: true)
196
+ logger.debug { "IOStreams::Pgp.list_keys: #{command}\n#{err}#{out}" } if logger
203
197
  if status.success? && out.length > 0
204
- # v2.0.30 output:
205
- # pub 4096R/3A5456F5 2017-06-07
206
- # uid [ unknown] Joe Bloggs <j@bloggs.net>
207
- # sub 4096R/2C9B240B 2017-06-07
208
- # v1.4 output:
209
- # sec 2048R/27D2E7FA 2016-10-05
210
- # uid Receiver <receiver@example.org>
211
- # ssb 2048R/893749EA 2016-10-05
212
198
  parse_list_output(out)
213
199
  else
214
- return [] if err =~ /(key not found|No (public|secret) key|key not available)/i
215
- raise(Pgp::Failure, "GPG Failed calling gpg to list keys for #{email || key_id}: #{err}#{out}")
200
+ return [] if err =~ /(not found|No (public|secret) key|key not available)/i
201
+ raise(Pgp::Failure, "GPG Failed calling '#{executable}' to list keys for #{email || key_id}: #{err}#{out}")
216
202
  end
217
203
  end
218
204
 
@@ -230,8 +216,10 @@ module IOStreams
230
216
  # email: [String]
231
217
  def self.key_info(key:)
232
218
  version_check
233
- out, err, status = Open3.capture3(executable, binmode: true, stdin_data: key)
234
- logger.debug { "IOStreams::Pgp.key_info output:\n#{err}#{out}" } if logger
219
+ command = "#{executable}"
220
+
221
+ out, err, status = Open3.capture3(command, binmode: true, stdin_data: key)
222
+ logger.debug { "IOStreams::Pgp.key_info: #{command}\n#{err}#{out}" } if logger
235
223
  if status.success? && out.length > 0
236
224
  # Sample Output:
237
225
  #
@@ -255,12 +243,21 @@ module IOStreams
255
243
  # private: [true|false]
256
244
  # Whether to export the private key
257
245
  # Default: false
258
- def self.export(email:, ascii: true, private: false)
246
+ #
247
+ # passphrase: [String]
248
+ # In order to export a private key the passphrase for the key must be supplied.
249
+ # Otherwise a `Inappropriate ioctl for device` error will be returned.
250
+ def self.export(email:, passphrase: nil, ascii: true, private: false)
259
251
  version_check
260
- armor = ascii ? '--armor' : nil
261
- cmd = private ? '--export-secret-keys' : '--export'
262
- out, err, status = Open3.capture3("#{executable} #{armor} #{cmd} #{email}", binmode: true)
263
- logger.debug { "IOStreams::Pgp.export output:\n#{err}" } if logger
252
+ raise(ArgumentError, "Missing keyword: passphrase when private: true") if private && passphrase.nil?
253
+
254
+ armor = ascii ? '--armor' : nil
255
+ cmd = private ? '--export-secret-keys' : '--export'
256
+ loopback = pgp_version.to_f >= 2.1 ? '--pinentry-mode loopback' : ''
257
+ command = "#{executable} #{loopback} --no-tty --passphrase-fd 0 --batch #{armor} #{cmd} #{email}"
258
+
259
+ out, err, status = Open3.capture3(command, binmode: true, stdin_data: "#{passphrase}\n")
260
+ logger.debug { "IOStreams::Pgp.export: #{command}\n#{err}" } if logger
264
261
  if status.success? && out.length > 0
265
262
  out
266
263
  else
@@ -285,8 +282,10 @@ module IOStreams
285
282
  # * Invalidated keys must be removed manually.
286
283
  def self.import(key:)
287
284
  version_check
288
- out, err, status = Open3.capture3("#{executable} --import", binmode: true, stdin_data: key)
289
- logger.debug { "IOStreams::Pgp.import output:\n#{err}#{out}" } if logger
285
+ command = "#{executable} --import"
286
+
287
+ out, err, status = Open3.capture3(command, binmode: true, stdin_data: key)
288
+ logger.debug { "IOStreams::Pgp.import: #{command}\n#{err}#{out}" } if logger
290
289
  if status.success? && err.length > 0
291
290
  # Sample output
292
291
  #
@@ -333,9 +332,10 @@ module IOStreams
333
332
  fingerprint = fingerprint(email: email)
334
333
  return unless fingerprint
335
334
 
335
+ command = "#{executable} --import-ownertrust"
336
336
  trust = "#{fingerprint}:#{level + 1}:\n"
337
- out, err, status = Open3.capture3("#{executable} --import-ownertrust", stdin_data: trust)
338
- logger.debug { "IOStreams::Pgp.set_trust output:\n#{err}#{out}" } if logger
337
+ out, err, status = Open3.capture3(command, stdin_data: trust)
338
+ logger.debug { "IOStreams::Pgp.set_trust: #{command}\n#{err}#{out}" } if logger
339
339
  if status.success?
340
340
  err
341
341
  else
@@ -357,7 +357,7 @@ module IOStreams
357
357
  nil
358
358
  else
359
359
  return if output =~ /(public key not found|No public key)/i
360
- raise(Pgp::Failure, "GPG Failed calling gpg to list keys for #{email}: #{output}")
360
+ raise(Pgp::Failure, "GPG Failed calling #{executable} to list keys for #{email}: #{output}")
361
361
  end
362
362
  end
363
363
  end
@@ -369,11 +369,12 @@ module IOStreams
369
369
  # Returns [String] the version of pgp currently installed
370
370
  def self.pgp_version
371
371
  @pgp_version ||= begin
372
- out, err, status = Open3.capture3("#{executable} --version")
373
- logger.debug { "IOStreams::Pgp.version output:\n#{err}#{out}" } if logger
372
+ command = "#{executable} --version"
373
+ out, err, status = Open3.capture3(command)
374
+ logger.debug { "IOStreams::Pgp.version: #{command}\n#{err}#{out}" } if logger
374
375
  if status.success?
375
376
  # Sample output
376
- # gpg (GnuPG) 2.0.30
377
+ # #{executable} (GnuPG) 2.0.30
377
378
  # libgcrypt 1.7.6
378
379
  # Copyright (C) 2015 Free Software Foundation, Inc.
379
380
  # License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
@@ -392,7 +393,7 @@ module IOStreams
392
393
  end
393
394
  else
394
395
  return [] if err =~ /(key not found|No (public|secret) key)/i
395
- raise(Pgp::Failure, "GPG Failed calling gpg to list keys for #{email || key_id}: #{err}#{out}")
396
+ raise(Pgp::Failure, "GPG Failed calling #{executable} to list keys for #{email || key_id}: #{err}#{out}")
396
397
  end
397
398
  end
398
399
  end
@@ -406,14 +407,35 @@ module IOStreams
406
407
  end
407
408
 
408
409
  def self.version_check
409
- raise(Pgp::UnsupportedVersion, "Version #{pgp_version} of gpg is not yet supported. You are welcome to submit a Pull Request.") if pgp_version.to_f >= 2.1
410
+ raise(Pgp::UnsupportedVersion, "Version #{pgp_version} of #{executable} is not yet supported. You are welcome to submit a Pull Request.") if pgp_version.to_f >= 2.3
410
411
  end
411
412
 
413
+ # v2.2.1 output:
414
+ # pub rsa1024 2017-10-24 [SCEA]
415
+ # 18A0FC1C09C0D8AE34CE659257DC4AE323C7368C
416
+ # uid [ultimate] Joe Bloggs <pgp_test@iostreams.net>
417
+ # sub rsa1024 2017-10-24 [SEA]
418
+ # v2.0.30 output:
419
+ # pub 4096R/3A5456F5 2017-06-07
420
+ # uid [ unknown] Joe Bloggs <j@bloggs.net>
421
+ # sub 4096R/2C9B240B 2017-06-07
422
+ # v1.4 output:
423
+ # sec 2048R/27D2E7FA 2016-10-05
424
+ # uid Receiver <receiver@example.org>
425
+ # ssb 2048R/893749EA 2016-10-05
412
426
  def self.parse_list_output(out)
413
427
  results = []
414
428
  hash = {}
415
429
  out.each_line do |line|
416
- if match = line.match(/(pub|sec)\s+(\d+)(.*)\/(\w+)\s+(\d+-\d+-\d+)(\s+(.+)<(.+)>)?/)
430
+ if match = line.match(/(pub|sec)\s+(\D+)(\d+)\s+(\d+-\d+-\d+)\s+(.*)/)
431
+ # v2.2: pub rsa1024 2017-10-24 [SCEA]
432
+ hash = {
433
+ private: match[1] == 'sec',
434
+ key_length: match[3].to_s.to_i,
435
+ key_type: match[2],
436
+ date: (Date.parse(match[4].to_s) rescue match[4])
437
+ }
438
+ elsif match = line.match(/(pub|sec)\s+(\d+)(.*)\/(\w+)\s+(\d+-\d+-\d+)(\s+(.+)<(.+)>)?/)
417
439
  # Matches: pub 2048R/C7F9D9CB 2016-10-26
418
440
  # Or: pub 2048R/C7F9D9CB 2016-10-26 Receiver <receiver@example.org>
419
441
  hash = {
@@ -433,16 +455,55 @@ module IOStreams
433
455
  elsif match = line.match(/uid\s+(\[(.+)\]\s+)?(.+)<(.+)>/)
434
456
  # Matches: uid [ unknown] Joe Bloggs <j@bloggs.net>
435
457
  # Or: uid Joe Bloggs <j@bloggs.net>
458
+ # v2.2: uid [ultimate] Joe Bloggs <pgp_test@iostreams.net>
436
459
  hash[:email] = match[4].strip
437
460
  hash[:name] = match[3].to_s.strip
438
461
  hash[:trust] = match[2].to_s.strip if match[1]
439
462
  results << hash
440
463
  hash = {}
464
+ elsif match = line.match(/([A-Z0-9]+)/)
465
+ # v2.2 18A0FC1C09C0D8AE34CE659257DC4AE323C7368C
466
+ hash[:key_id] ||= match[1]
441
467
  end
442
468
 
443
469
  end
444
470
  results
445
471
  end
446
472
 
473
+ def self.delete_public_or_private_keys(email:, private: false)
474
+ keys = private ? 'secret-keys' : 'keys'
475
+
476
+ list = list_keys(email: email, private: private)
477
+ return false if list.empty?
478
+
479
+ list.each do |key_info|
480
+ if key_id = key_info[:key_id]
481
+ command = "#{executable} --batch --no-tty --yes --delete-#{keys} #{key_id}"
482
+ out, err, status = Open3.capture3(command, binmode: true)
483
+ logger.debug { "IOStreams::Pgp.delete_keys: #{command}\n#{err}#{out}" } if logger
484
+
485
+ raise(Pgp::Failure, "GPG Failed calling #{executable} to delete #{keys} for #{email}: #{err}: #{out}") unless status.success?
486
+ raise(Pgp::Failure, "GPG Failed to delete #{keys} for #{email} #{err.strip}:#{out}") if out.include?('error')
487
+ end
488
+ end
489
+ true
490
+ end
491
+
492
+ def self.delete_public_or_private_keys_v1(email:, private: false)
493
+ keys = private ? 'secret-keys' : 'keys'
494
+
495
+ command = "for i in `#{executable} --list-#{keys} --with-colons --fingerprint #{email} | grep \"^fpr\" | cut -d: -f10`; do\n"
496
+ command << "#{executable} --batch --no-tty --yes --delete-#{keys} \"$i\" ;\n"
497
+ command << 'done'
498
+
499
+ out, err, status = Open3.capture3(command, binmode: true)
500
+ logger.debug { "IOStreams::Pgp.delete_keys: #{command}\n#{err}: #{out}" } if logger
501
+
502
+ return false if err =~ /(not found|no public key)/i
503
+ raise(Pgp::Failure, "GPG Failed calling #{executable} to delete #{keys} for #{email}: #{err}: #{out}") unless status.success?
504
+ raise(Pgp::Failure, "GPG Failed to delete #{keys} for #{email} #{err.strip}: #{out}") if out.include?('error')
505
+ true
506
+ end
507
+
447
508
  end
448
509
  end
@@ -20,8 +20,12 @@ module IOStreams
20
20
  if IOStreams.reader_stream?(file_name_or_io)
21
21
  raise(NotImplementedError, 'Can only PGP Decrypt directly from a file name. Input streams are not yet supported.')
22
22
  else
23
+ loopback = IOStreams::Pgp.pgp_version.to_f >= 2.1 ? '--pinentry-mode loopback' : ''
24
+ command = "#{IOStreams::Pgp.executable} #{loopback} --batch --no-tty --yes --decrypt --passphrase-fd 0 #{file_name_or_io}"
25
+ IOStreams::Pgp.logger.debug { "IOStreams::Pgp::Reader.open: #{command}" } if IOStreams::Pgp.logger
26
+
23
27
  # Read decrypted contents from stdout
24
- Open3.popen3("gpg --batch --no-tty --yes --decrypt --passphrase-fd 0 #{file_name_or_io}") do |stdin, stdout, stderr, waith_thr|
28
+ Open3.popen3(command) do |stdin, stdout, stderr, waith_thr|
25
29
  stdin.puts(passphrase) if passphrase
26
30
  stdin.close
27
31
  result =
@@ -51,13 +51,19 @@ module IOStreams
51
51
  raise(NotImplementedError, 'Can only PGP Encrypt directly to a file name. Output to streams are not yet supported.')
52
52
  else
53
53
  # Write to stdin, with encrypted contents being written to the file
54
- cmd = "gpg --batch --no-tty --yes --encrypt"
55
- cmd << " --sign --local-user \"#{signer}\"" if signer
56
- cmd << " --passphrase \"#{signer_passphrase}\"" if signer_passphrase
57
- cmd << " -z #{compress_level}" if compress_level != 6
58
- cmd << " --compress-algo #{compression}" unless compression == :none
59
- cmd << " --recipient \"#{recipient}\" -o \"#{file_name_or_io}\""
60
- Open3.popen2e(cmd) do |stdin, out, waith_thr|
54
+ command = "#{IOStreams::Pgp.executable} --batch --no-tty --yes --encrypt"
55
+ command << " --sign --local-user \"#{signer}\"" if signer
56
+ if signer_passphrase
57
+ command << " --pinentry-mode loopback" if IOStreams::Pgp.pgp_version.to_f >= 2.1
58
+ command << " --passphrase \"#{signer_passphrase}\""
59
+ end
60
+ command << " -z #{compress_level}" if compress_level != 6
61
+ command << " --compress-algo #{compression}" unless compression == :none
62
+ command << " --recipient \"#{recipient}\" -o \"#{file_name_or_io}\""
63
+
64
+ IOStreams::Pgp.logger.debug { "IOStreams::Pgp::Writer.open: #{command}" } if IOStreams::Pgp.logger
65
+
66
+ Open3.popen2e(command) do |stdin, out, waith_thr|
61
67
  begin
62
68
  stdin.binmode if binary
63
69
  yield(stdin)
@@ -1,3 +1,3 @@
1
1
  module IOStreams #:nodoc
2
- VERSION = '0.12.1'
2
+ VERSION = '0.13.0'
3
3
  end
@@ -52,6 +52,33 @@ module Streams
52
52
  end
53
53
  end
54
54
 
55
+ describe '.streams_for_file_name' do
56
+ it 'file only' do
57
+ streams = IOStreams.streams_for_file_name('a.xyz')
58
+ assert_equal [:file], streams
59
+ end
60
+
61
+ it 'single stream' do
62
+ streams = IOStreams.streams_for_file_name('a.gz')
63
+ assert_equal [:gz], streams
64
+ end
65
+
66
+ it 'multiple streams' do
67
+ streams = IOStreams.streams_for_file_name('a.xlsx.gz')
68
+ assert_equal [:xlsx, :gz], streams
69
+ end
70
+
71
+ it 'is case-insensitive' do
72
+ streams = IOStreams.streams_for_file_name('a.GzIp')
73
+ assert_equal [:gzip], streams
74
+ end
75
+
76
+ it 'multiple streams are case-insensitive' do
77
+ streams = IOStreams.streams_for_file_name('a.XlsX.Gz')
78
+ assert_equal [:xlsx, :gz], streams
79
+ end
80
+ end
81
+
55
82
  end
56
83
  end
57
84
  end
data/test/pgp_test.rb CHANGED
@@ -4,7 +4,7 @@ require_relative 'test_helper'
4
4
 
5
5
  module Streams
6
6
  class PgpTest < Minitest::Test
7
- describe IOStreams::Pgp::Reader do
7
+ describe IOStreams::Pgp do
8
8
  let :user_name do
9
9
  'Joe Bloggs'
10
10
  end
@@ -13,8 +13,12 @@ module Streams
13
13
  'pgp_test@iostreams.net'
14
14
  end
15
15
 
16
+ let :passphrase do
17
+ 'hello'
18
+ end
19
+
16
20
  let :generated_key_id do
17
- IOStreams::Pgp.generate_key(name: user_name, email: email, key_length: 1024)
21
+ IOStreams::Pgp.generate_key(name: user_name, email: email, key_length: 1024, passphrase: passphrase)
18
22
  end
19
23
 
20
24
  let :public_key do
@@ -24,11 +28,14 @@ module Streams
24
28
 
25
29
  let :private_key do
26
30
  generated_key_id
27
- IOStreams::Pgp.export(email: email, private: true)
31
+ IOStreams::Pgp.export(email: email, private: true, passphrase: passphrase)
28
32
  end
29
33
 
30
34
  before do
35
+ #ap IOStreams::Pgp.list_keys(email: email, private: true)
31
36
  IOStreams::Pgp.delete_keys(email: email, public: true, private: true)
37
+ #ap "KEYS DELETED"
38
+ #ap IOStreams::Pgp.list_keys(email: email, private: true)
32
39
  end
33
40
 
34
41
  describe '.pgp_version' do
@@ -86,7 +93,7 @@ module Streams
86
93
  end
87
94
 
88
95
  it 'exports private keys by email' do
89
- assert ascii_keys = IOStreams::Pgp.export(email: email, private: true)
96
+ assert ascii_keys = IOStreams::Pgp.export(email: email, private: true, passphrase: passphrase)
90
97
  assert ascii_keys =~ /BEGIN PGP PRIVATE KEY BLOCK/, ascii_keys
91
98
  end
92
99
 
@@ -96,7 +103,7 @@ module Streams
96
103
  end
97
104
 
98
105
  it 'exports private keys as binary' do
99
- assert keys = IOStreams::Pgp.export(email: email, ascii: false, private: true)
106
+ assert keys = IOStreams::Pgp.export(email: email, ascii: false, private: true, passphrase: passphrase)
100
107
  refute keys =~ /BEGIN PGP (PUBLIC|PRIVATE) KEY BLOCK/, keys
101
108
  end
102
109
  end
@@ -113,13 +120,12 @@ module Streams
113
120
 
114
121
  assert_equal key[:date], Date.today
115
122
  assert_equal email, key[:email]
116
- assert_equal generated_key_id, key[:key_id]
123
+ assert_includes key[:key_id], generated_key_id
117
124
  assert_equal 1024, key[:key_length]
118
- assert_equal 'R', key[:key_type]
125
+ assert_includes ['R', 'rsa'], key[:key_type]
119
126
  assert_equal user_name, key[:name]
120
127
  refute key[:private], key
121
128
  ver = IOStreams::Pgp.pgp_version
122
- ap "Running PGP tests with #{IOStreams::Pgp.executable} v#{ver}"
123
129
  maint = ver.split('.').last.to_i
124
130
  if (ver.to_f >= 2) && (maint >= 30)
125
131
  assert_equal 'ultimate', key[:trust]
@@ -133,12 +139,11 @@ module Streams
133
139
 
134
140
  assert_equal key[:date], Date.today
135
141
  assert_equal email, key[:email]
136
- assert_equal generated_key_id, key[:key_id]
142
+ assert_includes key[:key_id], generated_key_id
137
143
  assert_equal 1024, key[:key_length]
138
- assert_equal 'R', key[:key_type]
144
+ assert_includes ['R', 'rsa'], key[:key_type]
139
145
  assert_equal user_name, key[:name]
140
146
  assert key[:private], key
141
- refute key.key?(:trust)
142
147
  end
143
148
  end
144
149
 
@@ -150,22 +155,23 @@ module Streams
150
155
 
151
156
  assert_equal key[:date], Date.today
152
157
  assert_equal email, key[:email]
153
- assert_equal generated_key_id, key[:key_id]
158
+ assert_includes key[:key_id], generated_key_id
154
159
  assert_equal 1024, key[:key_length]
155
- assert_equal 'R', key[:key_type]
160
+ assert_includes ['R', 'rsa'], key[:key_type]
156
161
  assert_equal user_name, key[:name]
157
162
  refute key[:private], key
158
163
  refute key.key?(:trust)
159
164
  end
160
165
 
161
166
  it 'extracts private key info' do
167
+ skip 'GnuPG v2.1 and above does not allow batch inspection of private keys' if IOStreams::Pgp.pgp_version.to_f >= 2.1
162
168
  assert keys = IOStreams::Pgp.key_info(key: private_key)
163
169
  assert_equal 1, keys.size
164
170
  assert key = keys.first
165
171
 
166
172
  assert_equal key[:date], Date.today
167
173
  assert_equal email, key[:email]
168
- assert_equal generated_key_id, key[:key_id]
174
+ assert_includes key[:key_id], generated_key_id
169
175
  assert_equal 1024, key[:key_length]
170
176
  assert_equal 'R', key[:key_type]
171
177
  assert_equal user_name, key[:name]
@@ -204,6 +210,7 @@ module Streams
204
210
  end
205
211
 
206
212
  it 'imports ascii private key' do
213
+ skip 'GnuPG v2.1 and above does not allow batch import of private keys' if IOStreams::Pgp.pgp_version.to_f >= 2.1
207
214
  assert keys = IOStreams::Pgp.import(key: @private_key)
208
215
  assert_equal 1, keys.size
209
216
  assert key = keys.first
@@ -226,6 +233,7 @@ module Streams
226
233
  end
227
234
 
228
235
  it 'imports binary private key' do
236
+ skip 'GnuPG v2.1 and above does not allow batch import of private keys' if IOStreams::Pgp.pgp_version.to_f >= 2.1
229
237
  assert keys = IOStreams::Pgp.import(key: @private_key)
230
238
  assert_equal 1, keys.size
231
239
  assert key = keys.first
@@ -49,6 +49,7 @@ module Streams
49
49
  end
50
50
 
51
51
  it 'fails with bad signer passphrase' do
52
+ skip 'GnuPG v2.1 and above passes when it should not' if IOStreams::Pgp.pgp_version.to_f >= 2.1
52
53
  assert_raises IOStreams::Pgp::Failure do
53
54
  IOStreams::Pgp::Writer.open(@file_name, recipient: 'receiver@example.org', signer: 'sender@example.org', signer_passphrase: 'BAD') do |io|
54
55
  io.write(@data)
data/test/test_helper.rb CHANGED
@@ -17,6 +17,9 @@ SymmetricEncryption.cipher = SymmetricEncryption::Cipher.new(
17
17
  encoding: :base64strict
18
18
  )
19
19
 
20
+ #IOStreams::Pgp.logger = Logger.new($stdout)
21
+ #IOStreams::Pgp.executable = 'gpg1'
22
+
20
23
  # Test PGP Keys
21
24
  unless IOStreams::Pgp.has_key?(email: 'sender@example.org')
22
25
  puts 'Generating test PGP key: sender@example.org'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iostreams
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-20 00:00:00.000000000 Z
11
+ date: 2017-11-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -95,31 +95,31 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  version: '0'
96
96
  requirements: []
97
97
  rubyforge_project:
98
- rubygems_version: 2.6.11
98
+ rubygems_version: 2.6.13
99
99
  signing_key:
100
100
  specification_version: 4
101
101
  summary: Ruby file streaming. Supports Text, Zip, Gzip, Xlsx, csv, PGP / GPG and Symmetric
102
102
  Encryption.
103
103
  test_files:
104
- - test/csv_reader_test.rb
104
+ - test/pgp_reader_test.rb
105
+ - test/xlsx_reader_test.rb
105
106
  - test/csv_writer_test.rb
106
- - test/delimited_reader_test.rb
107
+ - test/zip_reader_test.rb
108
+ - test/gzip_writer_test.rb
107
109
  - test/delimited_writer_test.rb
108
110
  - test/file_reader_test.rb
109
- - test/file_writer_test.rb
111
+ - test/pgp_writer_test.rb
112
+ - test/csv_reader_test.rb
113
+ - test/zip_writer_test.rb
114
+ - test/delimited_reader_test.rb
115
+ - test/files/text.zip
110
116
  - test/files/spreadsheet.xlsx
111
117
  - test/files/test.csv
112
- - test/files/text.txt
113
- - test/files/text.txt.gz
114
118
  - test/files/text.txt.gz.zip
115
- - test/files/text.zip
119
+ - test/files/text.txt.gz
120
+ - test/files/text.txt
116
121
  - test/gzip_reader_test.rb
117
- - test/gzip_writer_test.rb
118
- - test/io_streams_test.rb
119
- - test/pgp_reader_test.rb
120
- - test/pgp_test.rb
121
- - test/pgp_writer_test.rb
122
122
  - test/test_helper.rb
123
- - test/xlsx_reader_test.rb
124
- - test/zip_reader_test.rb
125
- - test/zip_writer_test.rb
123
+ - test/file_writer_test.rb
124
+ - test/pgp_test.rb
125
+ - test/io_streams_test.rb