ruby_gpg2 0.9.0.pre.4 → 0.9.0.pre.7

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +37 -2
  4. data/LICENSE.txt +1 -1
  5. data/Rakefile +83 -46
  6. data/bin/console +4 -3
  7. data/lib/ruby_gpg2/colon_output.rb +61 -42
  8. data/lib/ruby_gpg2/colon_record.rb +257 -222
  9. data/lib/ruby_gpg2/commands/base.rb +9 -13
  10. data/lib/ruby_gpg2/commands/decrypt.rb +3 -2
  11. data/lib/ruby_gpg2/commands/encrypt.rb +3 -2
  12. data/lib/ruby_gpg2/commands/export.rb +2 -0
  13. data/lib/ruby_gpg2/commands/export_secret_keys.rb +2 -0
  14. data/lib/ruby_gpg2/commands/generate_key.rb +5 -1
  15. data/lib/ruby_gpg2/commands/import.rb +2 -0
  16. data/lib/ruby_gpg2/commands/list_public_keys.rb +3 -2
  17. data/lib/ruby_gpg2/commands/list_secret_keys.rb +3 -2
  18. data/lib/ruby_gpg2/commands/mixins/armor_config.rb +2 -0
  19. data/lib/ruby_gpg2/commands/mixins/batch_config.rb +2 -0
  20. data/lib/ruby_gpg2/commands/mixins/colon_config.rb +2 -0
  21. data/lib/ruby_gpg2/commands/mixins/global_config.rb +7 -2
  22. data/lib/ruby_gpg2/commands/mixins/input_config.rb +2 -0
  23. data/lib/ruby_gpg2/commands/mixins/output_config.rb +7 -2
  24. data/lib/ruby_gpg2/commands/mixins/passphrase_config.rb +7 -2
  25. data/lib/ruby_gpg2/commands/mixins/pinentry_config.rb +7 -2
  26. data/lib/ruby_gpg2/commands/mixins/recipient_config.rb +7 -2
  27. data/lib/ruby_gpg2/commands/mixins/status_config.rb +7 -2
  28. data/lib/ruby_gpg2/commands/mixins/trust_mode_config.rb +7 -2
  29. data/lib/ruby_gpg2/commands/mixins/with_captured_output.rb +10 -5
  30. data/lib/ruby_gpg2/commands/mixins/with_captured_status.rb +11 -7
  31. data/lib/ruby_gpg2/commands/mixins/with_result.rb +2 -0
  32. data/lib/ruby_gpg2/commands/mixins/without_passphrase.rb +8 -3
  33. data/lib/ruby_gpg2/commands/result.rb +3 -3
  34. data/lib/ruby_gpg2/commands.rb +3 -2
  35. data/lib/ruby_gpg2/key.rb +34 -25
  36. data/lib/ruby_gpg2/parameter_file_contents.rb +101 -51
  37. data/lib/ruby_gpg2/status_line.rb +15 -12
  38. data/lib/ruby_gpg2/status_lines/import_ok.rb +29 -25
  39. data/lib/ruby_gpg2/status_lines/import_problem.rb +19 -15
  40. data/lib/ruby_gpg2/status_lines/imported.rb +13 -9
  41. data/lib/ruby_gpg2/status_lines/key_considered.rb +18 -14
  42. data/lib/ruby_gpg2/status_lines/key_created.rb +20 -16
  43. data/lib/ruby_gpg2/status_lines/unimplemented.rb +6 -3
  44. data/lib/ruby_gpg2/status_lines.rb +2 -1
  45. data/lib/ruby_gpg2/status_output.rb +2 -0
  46. data/lib/ruby_gpg2/user_id.rb +19 -16
  47. data/lib/ruby_gpg2/version.rb +3 -1
  48. data/lib/ruby_gpg2.rb +2 -0
  49. data/ruby_gpg2.gemspec +55 -0
  50. metadata +64 -6
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'lino'
2
4
 
3
5
  require_relative 'base'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'lino'
2
4
 
3
5
  require_relative 'base'
@@ -16,8 +18,7 @@ module RubyGPG2
16
18
 
17
19
  def configure_command(builder, opts)
18
20
  builder = builder.with_subcommand('--list-public-keys')
19
- builder = super(builder, opts)
20
- builder
21
+ super(builder, opts)
21
22
  end
22
23
  end
23
24
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'lino'
2
4
 
3
5
  require_relative 'base'
@@ -16,8 +18,7 @@ module RubyGPG2
16
18
 
17
19
  def configure_command(builder, opts)
18
20
  builder = builder.with_subcommand('--list-secret-keys')
19
- builder = super(builder, opts)
20
- builder
21
+ super(builder, opts)
21
22
  end
22
23
  end
23
24
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -7,8 +9,11 @@ module RubyGPG2
7
9
  without_tty = opts[:without_tty].nil? ? true : opts[:without_tty]
8
10
 
9
11
  builder = super(builder, opts)
10
- builder = builder.with_option(
11
- '--homedir', home_directory, quoting: '"') if home_directory
12
+ if home_directory
13
+ builder = builder.with_option(
14
+ '--homedir', home_directory, quoting: '"'
15
+ )
16
+ end
12
17
  builder = builder.with_flag('--no-tty') if without_tty
13
18
  builder
14
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -6,8 +8,11 @@ module RubyGPG2
6
8
  output_file_path = opts[:output_file_path]
7
9
 
8
10
  builder = super(builder, opts)
9
- builder = builder.with_option(
10
- '--output', output_file_path, quoting: '"') if output_file_path
11
+ if output_file_path
12
+ builder = builder.with_option(
13
+ '--output', output_file_path, quoting: '"'
14
+ )
15
+ end
11
16
  builder
12
17
  end
13
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -6,8 +8,11 @@ module RubyGPG2
6
8
  passphrase = opts[:passphrase]
7
9
 
8
10
  builder = super(builder, opts)
9
- builder = builder.with_option(
10
- '--passphrase', passphrase, quoting: '"') if passphrase
11
+ if passphrase
12
+ builder = builder.with_option(
13
+ '--passphrase', passphrase, quoting: '"'
14
+ )
15
+ end
11
16
  builder
12
17
  end
13
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -6,8 +8,11 @@ module RubyGPG2
6
8
  pinentry_mode = opts[:pinentry_mode]
7
9
 
8
10
  builder = super(builder, opts)
9
- builder = builder.with_option(
10
- '--pinentry-mode', pinentry_mode) if pinentry_mode
11
+ if pinentry_mode
12
+ builder = builder.with_option(
13
+ '--pinentry-mode', pinentry_mode
14
+ )
15
+ end
11
16
  builder
12
17
  end
13
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -6,8 +8,11 @@ module RubyGPG2
6
8
  recipient = opts[:recipient]
7
9
 
8
10
  builder = super(builder, opts)
9
- builder = builder.with_option(
10
- '--recipient', recipient) if recipient
11
+ if recipient
12
+ builder = builder.with_option(
13
+ '--recipient', recipient
14
+ )
15
+ end
11
16
  builder
12
17
  end
13
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -6,8 +8,11 @@ module RubyGPG2
6
8
  status_file = opts[:status_file]
7
9
 
8
10
  builder = super(builder, opts)
9
- builder = builder.with_option(
10
- '--status-file', status_file, quoting: '"') if status_file
11
+ if status_file
12
+ builder = builder.with_option(
13
+ '--status-file', status_file, quoting: '"'
14
+ )
15
+ end
11
16
  builder
12
17
  end
13
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
@@ -6,8 +8,11 @@ module RubyGPG2
6
8
  trust_mode = opts[:trust_mode]
7
9
 
8
10
  builder = super(builder, opts)
9
- builder = builder.with_option(
10
- '--trust-mode', trust_mode) if trust_mode
11
+ if trust_mode
12
+ builder = builder.with_option(
13
+ '--trust-mode', trust_mode
14
+ )
15
+ end
11
16
  builder
12
17
  end
13
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'stringio'
2
4
 
3
5
  module RubyGPG2
@@ -7,15 +9,18 @@ module RubyGPG2
7
9
  def initialize(*args)
8
10
  super(*args)
9
11
  @stdout = StringIO.new unless
10
- (defined?(@stdout) && @stdout.respond_to?(:string))
12
+ defined?(@stdout) && @stdout.respond_to?(:string)
11
13
  end
12
14
 
13
15
  def do_after(opts)
16
+ super(opts.merge(output: resolve_output(stdout.string, opts)))
17
+ end
18
+
19
+ private
20
+
21
+ def resolve_output(output, opts)
14
22
  parse_output = opts[:parse_output].nil? ? true : opts[:parse_output]
15
- super(opts.merge(
16
- output: parse_output ?
17
- ColonOutput.parse(stdout.string) :
18
- stdout.string))
23
+ parse_output ? ColonOutput.parse(output) : output
19
24
  end
20
25
  end
21
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tempfile'
2
4
 
3
5
  require_relative '../../status_output'
@@ -8,8 +10,7 @@ module RubyGPG2
8
10
  module WithCapturedStatus
9
11
  def do_around(opts)
10
12
  if opts[:with_status]
11
- Tempfile.create(
12
- 'status-file', opts[:work_directory]) do |f|
13
+ Tempfile.create('status-file', opts[:work_directory]) do |f|
13
14
  yield opts.merge(status_file: f.path)
14
15
  @status = File.read(f.path)
15
16
  end
@@ -19,16 +20,19 @@ module RubyGPG2
19
20
  end
20
21
 
21
22
  def do_after(opts)
22
- parse_status = opts[:parse_status].nil? ? true : opts[:parse_status]
23
23
  if opts[:with_status]
24
- super(opts.merge(
25
- status: parse_status ?
26
- StatusOutput.parse(@status) :
27
- @status))
24
+ super(opts.merge(status: resolve_status(@status, opts)))
28
25
  else
29
26
  super(opts)
30
27
  end
31
28
  end
29
+
30
+ private
31
+
32
+ def resolve_status(status, opts)
33
+ parse_status = opts[:parse_status].nil? ? true : opts[:parse_status]
34
+ parse_status ? StatusOutput.parse(status) : status
35
+ end
32
36
  end
33
37
  end
34
38
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'stringio'
2
4
 
3
5
  module RubyGPG2
@@ -1,12 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
5
  module Mixins
4
6
  module WithoutPassphrase
5
7
  def configure_command(builder, opts)
6
8
  without_passphrase = opts[:without_passphrase]
7
- super(builder, without_passphrase ?
8
- opts.merge(passphrase: '', pinentry_mode: :loopback) :
9
- opts)
9
+ opts = if without_passphrase
10
+ opts.merge(passphrase: '', pinentry_mode: :loopback)
11
+ else
12
+ opts
13
+ end
14
+ super(builder, opts)
10
15
  end
11
16
  end
12
17
  end
@@ -1,7 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  module Commands
3
- class Result < Struct.new(:output, :status)
4
-
5
- end
5
+ Result = Struct.new(:output, :status)
6
6
  end
7
7
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'commands/decrypt'
2
4
  require_relative 'commands/encrypt'
3
5
  require_relative 'commands/export'
@@ -9,6 +11,5 @@ require_relative 'commands/list_secret_keys'
9
11
 
10
12
  module RubyGPG2
11
13
  module Commands
12
-
13
14
  end
14
- end
15
+ end
data/lib/ruby_gpg2/key.rb CHANGED
@@ -1,20 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyGPG2
2
4
  class Key
3
5
  attr_reader(
4
- :type,
5
- :validity,
6
- :length,
7
- :algorithm,
8
- :id,
9
- :creation_date,
10
- :owner_trust,
11
- :capabilities,
12
- :serial_number,
13
- :compliance_modes,
14
- :origin,
15
- :fingerprint,
16
- :user_ids)
6
+ :type,
7
+ :validity,
8
+ :length,
9
+ :algorithm,
10
+ :id,
11
+ :creation_date,
12
+ :owner_trust,
13
+ :capabilities,
14
+ :serial_number,
15
+ :compliance_modes,
16
+ :origin,
17
+ :fingerprint,
18
+ :user_ids
19
+ )
17
20
 
21
+ # rubocop:disable Metrics/MethodLength
22
+ # rubocop:disable Metrics/AbcSize
18
23
  def initialize(opts)
19
24
  @type = opts[:type]
20
25
  @validity = opts[:validity]
@@ -30,6 +35,8 @@ module RubyGPG2
30
35
  @fingerprint = opts[:fingerprint]
31
36
  @user_ids = opts[:user_ids]
32
37
  end
38
+ # rubocop:enable Metrics/AbcSize
39
+ # rubocop:enable Metrics/MethodLength
33
40
 
34
41
  def primary_user_id
35
42
  @user_ids&.first
@@ -41,21 +48,23 @@ module RubyGPG2
41
48
 
42
49
  protected
43
50
 
51
+ # rubocop:disable Metrics/MethodLength
44
52
  def state
45
53
  [
46
- @type,
47
- @validity,
48
- @length,
49
- @algorithm,
50
- @id,
51
- @creation_date,
52
- @owner_trust,
53
- @capabilities,
54
- @serial_number,
55
- @compliance_modes,
56
- @origin,
57
- @fingerprint
54
+ @type,
55
+ @validity,
56
+ @length,
57
+ @algorithm,
58
+ @id,
59
+ @creation_date,
60
+ @owner_trust,
61
+ @capabilities,
62
+ @serial_number,
63
+ @compliance_modes,
64
+ @origin,
65
+ @fingerprint
58
66
  ]
59
67
  end
68
+ # rubocop:enable Metrics/MethodLength
60
69
  end
61
70
  end
@@ -1,53 +1,41 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tempfile'
2
4
 
3
5
  module RubyGPG2
4
6
  class ParameterFileContents
5
7
  attr_reader(
6
- :key_type,
7
- :key_length,
8
- :subkey_type,
9
- :subkey_length,
10
- :owner_name,
11
- :owner_email,
12
- :owner_comment,
13
- :expiry,
14
- :passphrase)
8
+ :key_type,
9
+ :key_length,
10
+ :subkey_type,
11
+ :subkey_length,
12
+ :owner_name,
13
+ :owner_email,
14
+ :owner_comment,
15
+ :expiry,
16
+ :passphrase
17
+ )
15
18
 
16
19
  def initialize(opts)
17
- @key_type = opts.fetch(:key_type, 'RSA')
18
- @key_length = opts.fetch(:key_length,
19
- (@key_type.to_s == 'default' ? nil : 2048))
20
- @subkey_type = opts.fetch(:subkey_type, 'RSA')
21
- @subkey_length = opts.fetch(:subkey_length,
22
- ((@subkey_type.nil? || @subkey_type.to_s == 'default') ? nil : 2048))
23
- @owner_name = opts.fetch(:owner_name, nil)
24
- @owner_email = opts.fetch(:owner_email, nil)
25
- @owner_comment = opts.fetch(:owner_comment, nil)
26
- @expiry = opts.fetch(:expiry, :never)
27
- @passphrase = opts.fetch(:passphrase, nil)
20
+ @key_type = resolve_key_type(opts)
21
+ @key_length = resolve_key_length(opts, @key_type)
22
+ @subkey_type = resolve_subkey_type(opts)
23
+ @subkey_length = resolve_subkey_length(opts, @subkey_type)
24
+ @owner_name = resolve_owner_name(opts)
25
+ @owner_email = resolve_owner_email(opts)
26
+ @owner_comment = resolve_owner_comment(opts)
27
+ @expiry = resolve_expiry(opts)
28
+ @passphrase = resolve_passphrase(opts)
28
29
 
29
- owner_name_present = !@owner_name.nil?
30
- owner_email_present = !@owner_email.nil?
31
- missing_count = [
32
- owner_name_present,
33
- owner_email_present
34
- ].count(false)
35
- missing_names = [
36
- owner_name_present ? nil : :owner_name,
37
- owner_email_present ? nil : :owner_email
38
- ].compact
39
-
40
- unless missing_count == 0
41
- raise RuntimeError.new(
42
- "Missing required parameter#{missing_count > 1 ? 's' : ''}: " +
43
- "#{missing_names}.")
44
- end
30
+ assert_required_parameters_present
31
+ end
32
+
33
+ def expiry_date
34
+ expiry == :never ? 0 : expiry
45
35
  end
46
36
 
47
37
  def write_to(path)
48
- File.open(path, 'w') do |f|
49
- f.write(to_s)
50
- end
38
+ File.open(path, 'w') { |f| f.write(to_s) }
51
39
  end
52
40
 
53
41
  def in_temp_file(tmpdir = nil)
@@ -59,22 +47,84 @@ module RubyGPG2
59
47
  end
60
48
 
61
49
  def to_s
62
- [
63
- parm("Key-Type", key_type),
64
- parm("Key-Length", key_length),
65
- parm("Subkey-Type", subkey_type),
66
- parm('Subkey-Length', subkey_length),
67
- parm('Name-Real', owner_name),
68
- parm('Name-Comment', owner_comment),
69
- parm('Name-Email', owner_email),
70
- parm('Expire-Date',
71
- expiry == :never ? 0 : expiry),
72
- parm('Passphrase', passphrase),
73
- ].compact.join("\n") + "\n"
50
+ "#{to_parms.compact.join("\n")}\n"
74
51
  end
75
52
 
76
53
  private
77
54
 
55
+ def assert_required_parameters_present
56
+ owner_name_present = !@owner_name.nil?
57
+ owner_email_present = !@owner_email.nil?
58
+ missing_count = [owner_name_present, owner_email_present].count(false)
59
+ missing_names =
60
+ [to_error_code(owner_name_present, :owner_name),
61
+ to_error_code(owner_email_present, :owner_email)].compact
62
+
63
+ return if missing_count.zero?
64
+
65
+ raise "Missing required parameter#{missing_count > 1 ? 's' : ''}: " \
66
+ "#{missing_names}."
67
+ end
68
+
69
+ def to_error_code(present, code)
70
+ present ? nil : code
71
+ end
72
+
73
+ def resolve_key_type(opts)
74
+ opts.fetch(:key_type, 'RSA')
75
+ end
76
+
77
+ def resolve_key_length(opts, key_type)
78
+ opts.fetch(
79
+ :key_length, (key_type.to_s == 'default' ? nil : 2048)
80
+ )
81
+ end
82
+
83
+ def resolve_subkey_type(opts)
84
+ opts.fetch(:subkey_type, 'RSA')
85
+ end
86
+
87
+ def resolve_subkey_length(opts, subkey_type)
88
+ opts.fetch(
89
+ :subkey_length,
90
+ (subkey_type.nil? || subkey_type.to_s == 'default' ? nil : 2048)
91
+ )
92
+ end
93
+
94
+ def resolve_owner_name(opts)
95
+ opts.fetch(:owner_name, nil)
96
+ end
97
+
98
+ def resolve_owner_email(opts)
99
+ opts.fetch(:owner_email, nil)
100
+ end
101
+
102
+ def resolve_owner_comment(opts)
103
+ opts.fetch(:owner_comment, nil)
104
+ end
105
+
106
+ def resolve_expiry(opts)
107
+ opts.fetch(:expiry, :never)
108
+ end
109
+
110
+ def resolve_passphrase(opts)
111
+ opts.fetch(:passphrase, nil)
112
+ end
113
+
114
+ # rubocop:disable Metrics/AbcSize
115
+ def to_parms
116
+ [parm('Key-Type', key_type),
117
+ parm('Key-Length', key_length),
118
+ parm('Subkey-Type', subkey_type),
119
+ parm('Subkey-Length', subkey_length),
120
+ parm('Name-Real', owner_name),
121
+ parm('Name-Comment', owner_comment),
122
+ parm('Name-Email', owner_email),
123
+ parm('Expire-Date', expiry_date),
124
+ parm('Passphrase', passphrase)]
125
+ end
126
+ # rubocop:enable Metrics/AbcSize
127
+
78
128
  def parm(name, value)
79
129
  value ? "#{name}: #{value}" : nil
80
130
  end
@@ -1,23 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'status_lines'
2
4
 
3
5
  module RubyGPG2
4
6
  class StatusLine
5
- TYPE_REGEX = /^\[GNUPG:\] (.*?)(\s|$)/
7
+ TYPE_REGEX = /^\[GNUPG:\] (.*?)(\s|$)/.freeze
6
8
 
7
9
  TYPES = {
8
- "IMPORT_OK" => StatusLines::ImportOK,
9
- "IMPORT_PROBLEM" => StatusLines::ImportProblem,
10
- "IMPORTED" => StatusLines::Imported,
11
- "KEY_CREATED" => StatusLines::KeyCreated,
12
- "KEY_CONSIDERED" => StatusLines::KeyConsidered
13
- }
10
+ 'IMPORT_OK' => StatusLines::ImportOK,
11
+ 'IMPORT_PROBLEM' => StatusLines::ImportProblem,
12
+ 'IMPORTED' => StatusLines::Imported,
13
+ 'KEY_CREATED' => StatusLines::KeyCreated,
14
+ 'KEY_CONSIDERED' => StatusLines::KeyConsidered
15
+ }.freeze
14
16
 
15
17
  def self.parse(line)
16
18
  TYPES
17
- .fetch(
18
- line.match(TYPE_REGEX)[1],
19
- StatusLines::Unimplemented)
20
- .parse(line)
19
+ .fetch(
20
+ line.match(TYPE_REGEX)[1],
21
+ StatusLines::Unimplemented
22
+ )
23
+ .parse(line)
21
24
  end
22
25
  end
23
- end
26
+ end