iostreams 0.12.0 → 0.12.1

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: d4dcddf28ba98342cec548ede58e83e08f6d4948
4
- data.tar.gz: 0fd6ff53b81dc4fdd8847f5c646d875aa03f7c4e
3
+ metadata.gz: 0d18dafc30b8314925e4bc352ff146bcf39ec0c6
4
+ data.tar.gz: 8fc00eda8c6a850f5e8abe6386718a483b04884c
5
5
  SHA512:
6
- metadata.gz: '09453fc367c6d133311676971c31e9135549559995f2ffbcb9960bfd6054121344c6c6b5d7eb85bfb993b1531a8d70a7299659bceb0cffb12805b9ce823ac035'
7
- data.tar.gz: afb3e83e545230f98a6e2acf936e937d20fdc3a753607aae039788daae426cd0bbd03d5018272e0c179512b7e4b55e6a9fcc8af2ad4b83b43aa05996630de446
6
+ metadata.gz: 7d0c13bb7daa4480884ce323b229a0018ec37ded48aad8ad2c10502a085e14970d354de06306898fd989225b6aaaf3a2fc0fdee563c7bb3a7e7bf84413ab74ce
7
+ data.tar.gz: 7b70b19a019542d1c400d7ef1e99622acc73342a07444402f7326c341496b6a92e5985e807dd811004135b5f30c806aaf9ccdbaadf80394a14a764e6fadfd862
@@ -26,7 +26,7 @@ module IOStreams
26
26
  # # Recipient must also have the senders public key to verify the signature
27
27
  # IOStreams::Pgp::Reader.open('secure.gpg', passphrase: 'receiver_passphrase') do |stream|
28
28
  # while !stream.eof?
29
- # ap stream.read(10)
29
+ # p stream.read(10)
30
30
  # puts
31
31
  # end
32
32
  # end
@@ -52,7 +52,7 @@ module IOStreams
52
52
  # # Recipient must also have the senders public key to verify the signature
53
53
  # IOStreams.reader('secure.gpg') do |stream|
54
54
  # while data = stream.read(10)
55
- # ap data
55
+ # p data
56
56
  # end
57
57
  # end
58
58
  #
@@ -77,6 +77,10 @@ module IOStreams
77
77
  # :zip: size: 411MB write: 75s read: 31s
78
78
  # :zlib: size: 241MB write: 66s read: 23s ( 756KB Memory )
79
79
  # :bzip2: size: 129MB write: 430s read: 130s ( 5MB Memory )
80
+ #
81
+ # Notes:
82
+ # - Tested against gnupg v1.4.21 and v2.0.30
83
+ # - Does not work yet with gnupg v2.1. Pull Requests welcome.
80
84
  module Pgp
81
85
  autoload :Reader, 'io_streams/pgp/reader'
82
86
  autoload :Writer, 'io_streams/pgp/writer'
@@ -87,6 +91,16 @@ module IOStreams
87
91
  class UnsupportedVersion < Failure
88
92
  end
89
93
 
94
+ def self.executable
95
+ @executable
96
+ end
97
+
98
+ def self.executable=(executable)
99
+ @executable = executable
100
+ end
101
+
102
+ @executable = 'gpg'
103
+
90
104
  # Generate a new ultimate trusted local public and private key.
91
105
  #
92
106
  # Returns [String] the key id for the generated key.
@@ -121,7 +135,7 @@ module IOStreams
121
135
  params << "Expire-Date: #{expire_date}\n" if expire_date
122
136
  params << "Passphrase: #{passphrase}\n" if passphrase
123
137
  params << '%commit'
124
- out, err, status = Open3.capture3('gpg --batch --gen-key', binmode: true, stdin_data: params)
138
+ out, err, status = Open3.capture3("#{executable} --batch --gen-key", binmode: true, stdin_data: params)
125
139
  logger.debug { "IOStreams::Pgp.generate_key output:\n#{out}#{err}" } if logger
126
140
  if status.success?
127
141
  if match = err.match(/gpg: key ([0-9A-F]+)\s+/)
@@ -149,8 +163,8 @@ module IOStreams
149
163
  def self.delete_keys(email:, public: true, private: false)
150
164
  version_check
151
165
  cmd = "for i in `gpg --with-colons --fingerprint #{email} | grep \"^fpr\" | cut -d: -f10`; do\n"
152
- cmd << "gpg --batch --delete-secret-keys \"$i\" ;\n" if private
153
- cmd << "gpg --batch --delete-keys \"$i\" ;\n" if public
166
+ cmd << "#{executable} --batch --delete-secret-keys \"$i\" ;\n" if private
167
+ cmd << "#{executable} --batch --delete-keys \"$i\" ;\n" if public
154
168
  cmd << 'done'
155
169
 
156
170
  out, err, status = Open3.capture3(cmd, binmode: true)
@@ -184,16 +198,20 @@ module IOStreams
184
198
  def self.list_keys(email: nil, key_id: nil, private: false)
185
199
  version_check
186
200
  cmd = private ? '--list-secret-keys' : '--list-keys'
187
- out, err, status = Open3.capture3("gpg #{cmd} #{email || key_id}", binmode: true)
201
+ out, err, status = Open3.capture3("#{executable} #{cmd} #{email || key_id}", binmode: true)
188
202
  logger.debug { "IOStreams::Pgp.list_keys output:\n#{err}#{out}" } if logger
189
203
  if status.success? && out.length > 0
190
- # Sample output
204
+ # v2.0.30 output:
191
205
  # pub 4096R/3A5456F5 2017-06-07
192
206
  # uid [ unknown] Joe Bloggs <j@bloggs.net>
193
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
194
212
  parse_list_output(out)
195
213
  else
196
- return [] if err =~ /(key not found|No (public|secret) key)/i
214
+ return [] if err =~ /(key not found|No (public|secret) key|key not available)/i
197
215
  raise(Pgp::Failure, "GPG Failed calling gpg to list keys for #{email || key_id}: #{err}#{out}")
198
216
  end
199
217
  end
@@ -212,7 +230,7 @@ module IOStreams
212
230
  # email: [String]
213
231
  def self.key_info(key:)
214
232
  version_check
215
- out, err, status = Open3.capture3('gpg', binmode: true, stdin_data: key)
233
+ out, err, status = Open3.capture3(executable, binmode: true, stdin_data: key)
216
234
  logger.debug { "IOStreams::Pgp.key_info output:\n#{err}#{out}" } if logger
217
235
  if status.success? && out.length > 0
218
236
  # Sample Output:
@@ -239,9 +257,9 @@ module IOStreams
239
257
  # Default: false
240
258
  def self.export(email:, ascii: true, private: false)
241
259
  version_check
242
- armor = ascii ? ' --armor' : nil
260
+ armor = ascii ? '--armor' : nil
243
261
  cmd = private ? '--export-secret-keys' : '--export'
244
- out, err, status = Open3.capture3("gpg#{armor} #{cmd} #{email}", binmode: true)
262
+ out, err, status = Open3.capture3("#{executable} #{armor} #{cmd} #{email}", binmode: true)
245
263
  logger.debug { "IOStreams::Pgp.export output:\n#{err}" } if logger
246
264
  if status.success? && out.length > 0
247
265
  out
@@ -267,7 +285,7 @@ module IOStreams
267
285
  # * Invalidated keys must be removed manually.
268
286
  def self.import(key:)
269
287
  version_check
270
- out, err, status = Open3.capture3('gpg --import', binmode: true, stdin_data: key)
288
+ out, err, status = Open3.capture3("#{executable} --import", binmode: true, stdin_data: key)
271
289
  logger.debug { "IOStreams::Pgp.import output:\n#{err}#{out}" } if logger
272
290
  if status.success? && err.length > 0
273
291
  # Sample output
@@ -316,7 +334,7 @@ module IOStreams
316
334
  return unless fingerprint
317
335
 
318
336
  trust = "#{fingerprint}:#{level + 1}:\n"
319
- out, err, status = Open3.capture3('gpg --import-ownertrust', stdin_data: trust)
337
+ out, err, status = Open3.capture3("#{executable} --import-ownertrust", stdin_data: trust)
320
338
  logger.debug { "IOStreams::Pgp.set_trust output:\n#{err}#{out}" } if logger
321
339
  if status.success?
322
340
  err
@@ -328,7 +346,7 @@ module IOStreams
328
346
  # DEPRECATED - Use key_ids instead of fingerprints
329
347
  def self.fingerprint(email:)
330
348
  version_check
331
- Open3.popen2e("gpg --list-keys --fingerprint --with-colons #{email}") do |stdin, out, waith_thr|
349
+ Open3.popen2e("#{executable} --list-keys --fingerprint --with-colons #{email}") do |stdin, out, waith_thr|
332
350
  output = out.read.chomp
333
351
  if waith_thr.value.success?
334
352
  output.each_line do |line|
@@ -351,7 +369,7 @@ module IOStreams
351
369
  # Returns [String] the version of pgp currently installed
352
370
  def self.pgp_version
353
371
  @pgp_version ||= begin
354
- out, err, status = Open3.capture3("gpg --version")
372
+ out, err, status = Open3.capture3("#{executable} --version")
355
373
  logger.debug { "IOStreams::Pgp.version output:\n#{err}#{out}" } if logger
356
374
  if status.success?
357
375
  # Sample output
@@ -395,7 +413,9 @@ module IOStreams
395
413
  results = []
396
414
  hash = {}
397
415
  out.each_line do |line|
398
- if match = line.match(/(pub|sec)\s+(\d+)(.*)\/(\w+)\s+(\S+)/)
416
+ if match = line.match(/(pub|sec)\s+(\d+)(.*)\/(\w+)\s+(\d+-\d+-\d+)(\s+(.+)<(.+)>)?/)
417
+ # Matches: pub 2048R/C7F9D9CB 2016-10-26
418
+ # Or: pub 2048R/C7F9D9CB 2016-10-26 Receiver <receiver@example.org>
399
419
  hash = {
400
420
  private: match[1] == 'sec',
401
421
  key_length: match[2].to_s.to_i,
@@ -403,19 +423,23 @@ module IOStreams
403
423
  key_id: match[4],
404
424
  date: (Date.parse(match[5].to_s) rescue match[5])
405
425
  }
406
- elsif match = line.match(/uid\s+(.+)<(.+)>/)
407
- name = match[1].strip
408
- hash[:email] = match[2].strip
409
- if match = name.match(/(\[(.+)\])?(.+)/)
410
- trust = match[2].to_s.strip
411
- hash[:trust] = trust unless trust.empty?
412
- hash[:name] = match[3].to_s.strip
413
- else
414
- hash[:name] = name
426
+ # Prior to gpg v2.0.30
427
+ if match[7]
428
+ hash[:name] = match[7].strip
429
+ hash[:email] = match[8].strip
430
+ results << hash
431
+ hash = {}
415
432
  end
433
+ elsif match = line.match(/uid\s+(\[(.+)\]\s+)?(.+)<(.+)>/)
434
+ # Matches: uid [ unknown] Joe Bloggs <j@bloggs.net>
435
+ # Or: uid Joe Bloggs <j@bloggs.net>
436
+ hash[:email] = match[4].strip
437
+ hash[:name] = match[3].to_s.strip
438
+ hash[:trust] = match[2].to_s.strip if match[1]
416
439
  results << hash
417
440
  hash = {}
418
441
  end
442
+
419
443
  end
420
444
  results
421
445
  end
@@ -1,3 +1,3 @@
1
1
  module IOStreams #:nodoc
2
- VERSION = '0.12.0'
2
+ VERSION = '0.12.1'
3
3
  end
data/test/pgp_test.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require_relative 'test_helper'
2
2
 
3
- #IOStreams::Pgp.logger = SemanticLogger[IOStreams::Pgp]
3
+ #IOStreams::Pgp.logger = Logger.new(STDOUT)
4
4
 
5
5
  module Streams
6
6
  class PgpTest < Minitest::Test
@@ -118,7 +118,12 @@ module Streams
118
118
  assert_equal 'R', key[:key_type]
119
119
  assert_equal user_name, key[:name]
120
120
  refute key[:private], key
121
- assert_equal 'ultimate', key[:trust]
121
+ ver = IOStreams::Pgp.pgp_version
122
+ ap "Running PGP tests with #{IOStreams::Pgp.executable} v#{ver}"
123
+ maint = ver.split('.').last.to_i
124
+ if (ver.to_f >= 2) && (maint >= 30)
125
+ assert_equal 'ultimate', key[:trust]
126
+ end
122
127
  end
123
128
 
124
129
  it 'lists private keys' do
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.0
4
+ version: 0.12.1
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-16 00:00:00.000000000 Z
11
+ date: 2017-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby