rgpg 0.2.3 → 0.2.4
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.
- data/lib/rgpg.rb +7 -2
- data/lib/rgpg/gem_info.rb +1 -1
- data/lib/rgpg/gpg_helper.rb +48 -19
- metadata +2 -2
data/lib/rgpg.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
if RUBY_VERSION < '1.9.0'
|
2
|
+
require File.expand_path('../rgpg/gem_info', __FILE__)
|
3
|
+
require File.expand_path('../rgpg/gpg_helper', __FILE__)
|
4
|
+
else
|
5
|
+
require_relative 'rgpg/gem_info'
|
6
|
+
require_relative 'rgpg/gpg_helper'
|
7
|
+
end
|
3
8
|
|
data/lib/rgpg/gem_info.rb
CHANGED
data/lib/rgpg/gpg_helper.rb
CHANGED
@@ -11,8 +11,10 @@ module Rgpg
|
|
11
11
|
begin
|
12
12
|
script_file.write(script)
|
13
13
|
script_file.close
|
14
|
-
|
15
|
-
|
14
|
+
run_gpg_no_capture(
|
15
|
+
'--batch',
|
16
|
+
'--gen-key', script_file.path
|
17
|
+
)
|
16
18
|
ensure
|
17
19
|
script_file.close
|
18
20
|
script_file.unlink
|
@@ -25,7 +27,7 @@ module Rgpg
|
|
25
27
|
|
26
28
|
recipient = get_recipient(public_key_file_name)
|
27
29
|
with_temporary_encrypt_keyring(public_key_file_name) do |keyring_file_name|
|
28
|
-
|
30
|
+
run_gpg_capture(
|
29
31
|
'--keyring', keyring_file_name,
|
30
32
|
'--output', output_file_name,
|
31
33
|
'--encrypt',
|
@@ -44,7 +46,7 @@ module Rgpg
|
|
44
46
|
|
45
47
|
recipient = get_recipient(private_key_file_name)
|
46
48
|
with_temporary_decrypt_keyrings(public_key_file_name, private_key_file_name) do |keyring_file_name, secret_keyring_file_name|
|
47
|
-
|
49
|
+
run_gpg_capture(
|
48
50
|
'--keyring', keyring_file_name,
|
49
51
|
'--secret-keyring', secret_keyring_file_name,
|
50
52
|
'--output', output_file_name,
|
@@ -58,21 +60,49 @@ module Rgpg
|
|
58
60
|
|
59
61
|
private
|
60
62
|
|
61
|
-
def self.
|
63
|
+
def self.with_temp_home_dir
|
64
|
+
Dir.mktmpdir('.rgpg-tmp-', ENV['HOME']) do |home_dir|
|
65
|
+
yield home_dir
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.build_safe_command_line(home_dir, *args)
|
62
70
|
fragments = [
|
63
71
|
'gpg',
|
72
|
+
'--homedir', home_dir,
|
64
73
|
'--no-default-keyring'
|
65
74
|
] + args
|
66
|
-
|
75
|
+
fragments.collect { |fragment| Shellwords.escape(fragment) }.join(' ')
|
76
|
+
end
|
67
77
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
result = system(
|
72
|
-
|
73
|
-
|
78
|
+
def self.run_gpg_no_capture(*args)
|
79
|
+
with_temp_home_dir do |home_dir|
|
80
|
+
command_line = build_safe_command_line(home_dir, *args)
|
81
|
+
result = system(command_line)
|
82
|
+
raise RuntimeError.new('gpg failed') unless result
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.run_gpg_capture(*args)
|
87
|
+
with_temp_home_dir do |home_dir|
|
88
|
+
command_line = build_safe_command_line(home_dir, *args)
|
89
|
+
|
90
|
+
output_file = Tempfile.new('gpg-output')
|
91
|
+
begin
|
92
|
+
output_file.close
|
93
|
+
result = system("#{command_line} > #{Shellwords.escape(output_file.path)} 2>&1")
|
94
|
+
|
95
|
+
output = nil
|
96
|
+
File.open(output_file.path) do |f|
|
97
|
+
output = f.read
|
98
|
+
end
|
99
|
+
raise RuntimeError.new("gpg failed: #{output}") unless result
|
100
|
+
|
101
|
+
output.lines.collect(&:chomp)
|
102
|
+
ensure
|
103
|
+
output_file.unlink
|
104
|
+
end
|
74
105
|
end
|
75
|
-
raise RuntimeError.new('gpg failed') unless result
|
76
106
|
end
|
77
107
|
|
78
108
|
def self.generate_key_script(public_key_file_name, private_key_file_name, recipient, real_name)
|
@@ -95,17 +125,16 @@ module Rgpg
|
|
95
125
|
end
|
96
126
|
|
97
127
|
def self.get_recipient(key_file_name)
|
98
|
-
|
99
|
-
|
100
|
-
|
128
|
+
lines = run_gpg_capture(key_file_name)
|
129
|
+
result = lines.detect { |line| line =~ /^(pub|sec)\s+\d+D\/([0-9a-fA-F]{8}).+<(.+)>/ }
|
130
|
+
raise RuntimeError.new('Invalid output') unless result
|
101
131
|
key_id = $2
|
102
132
|
recipient = $3
|
103
|
-
recipient
|
104
133
|
end
|
105
134
|
|
106
135
|
def self.with_temporary_encrypt_keyring(public_key_file_name)
|
107
136
|
with_temporary_keyring_file do |keyring_file_name|
|
108
|
-
|
137
|
+
run_gpg_capture(
|
109
138
|
'--keyring', keyring_file_name,
|
110
139
|
'--import', public_key_file_name
|
111
140
|
)
|
@@ -116,7 +145,7 @@ module Rgpg
|
|
116
145
|
def self.with_temporary_decrypt_keyrings(public_key_file_name, private_key_file_name)
|
117
146
|
with_temporary_keyring_file do |keyring_file_name|
|
118
147
|
with_temporary_keyring_file do |secret_keyring_file_name|
|
119
|
-
|
148
|
+
run_gpg_capture(
|
120
149
|
'--keyring', keyring_file_name,
|
121
150
|
'--secret-keyring', secret_keyring_file_name,
|
122
151
|
'--import', private_key_file_name
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgpg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-04 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Simple Ruby wrapper around "gpg" command for file encryption
|
15
15
|
email: rcook@rcook.org
|