gpgme 2.0.2 → 2.0.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.
- checksums.yaml +7 -0
- data/ext/gpgme/extconf.rb +185 -37
- data/ext/gpgme/gpgme_n.c +88 -8
- data/lib/gpgme/constants.rb +12 -0
- data/lib/gpgme/ctx.rb +23 -4
- data/lib/gpgme/data.rb +1 -1
- data/lib/gpgme/misc.rb +7 -0
- data/ports/archives/gpgme-1.4.3.tar.bz2 +0 -0
- data/ports/archives/libassuan-2.1.1.tar.bz2 +0 -0
- data/ports/archives/libgpg-error-1.12.tar.bz2 +0 -0
- data/test/ctx_test.rb +22 -4
- metadata +33 -32
- data/ext/gpgme/gpgme-1.4.0.tar.bz2 +0 -0
- data/ext/gpgme/libassuan-2.1.0.tar.bz2 +0 -0
- data/ext/gpgme/libgpg-error-1.11.tar.bz2 +0 -0
- data/ext/gpgme/libgpg-error-1.11.tar.gz +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cee9137e390ab8ba123ecac6b939c97bcc503f41
|
4
|
+
data.tar.gz: dd2d64bdc427465e8700d6088406c5007cb0d386
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e200b2c41ea564fa46d2415699f86f6c9d04e1b2aabbdae4f2cf684712720ac3520ebd7d6cfa27a3ab8b7eb596563f153d126ca7293b6740a47108083093cdf4
|
7
|
+
data.tar.gz: d179bae893e54223e758fc49b2d6dbec6f5e5ddd084ebb02835fc65ade34768bd4893e356fa6836bafb4f892b8e674ccaea9b5904e14c861ce270512d4cbc1d0
|
data/ext/gpgme/extconf.rb
CHANGED
@@ -1,58 +1,206 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
# Available options:
|
4
|
+
#
|
5
|
+
# --enable-clean (default)
|
6
|
+
# --disable-clean
|
7
|
+
#
|
8
|
+
# This file is largely based on Nokogiri's extconf.rb.
|
6
9
|
|
7
|
-
|
8
|
-
puts " -- #{cmd.join(' ')}"
|
10
|
+
ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
if arg_config('--clean')
|
13
|
+
require 'pathname'
|
14
|
+
require 'fileutils'
|
15
|
+
|
16
|
+
root = Pathname(ROOT)
|
17
|
+
pwd = Pathname(Dir.pwd)
|
18
|
+
|
19
|
+
# Skip if this is a development work tree
|
20
|
+
unless (root + '.git').exist?
|
21
|
+
message "Cleaning files only used during build.\n"
|
22
|
+
|
23
|
+
# (root + 'tmp') cannot be removed at this stage because
|
24
|
+
# gpgme_n.so is yet to be copied to lib.
|
25
|
+
|
26
|
+
# clean the ports build directory
|
27
|
+
Pathname.glob(pwd.join('tmp', '*', 'ports')) { |dir|
|
28
|
+
FileUtils.rm_rf(dir, { :verbose => true })
|
29
|
+
FileUtils.rmdir(dir.parent, { :parents => true, :verbose => true })
|
30
|
+
}
|
31
|
+
|
32
|
+
# ports installation can be safely removed if statically linked.
|
33
|
+
FileUtils.rm_rf(root + 'ports', { :verbose => true })
|
12
34
|
end
|
13
35
|
|
14
|
-
|
36
|
+
exit
|
15
37
|
end
|
16
38
|
|
17
|
-
|
18
|
-
|
39
|
+
if arg_config('--use-system-libraries', ENV['RUBY_GPGME_USE_SYSTEM_LIBRARIES'])
|
40
|
+
unless find_executable('gpgme-config')
|
41
|
+
$stderr.puts("gpgme-config not found")
|
42
|
+
exit(1)
|
43
|
+
end
|
19
44
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
45
|
+
$CFLAGS += ' ' << `gpgme-config --cflags`.chomp
|
46
|
+
$libs += ' ' << `gpgme-config --libs`.chomp
|
47
|
+
else
|
48
|
+
def message!(important_message)
|
49
|
+
message important_message
|
50
|
+
if !$stdout.tty? && File.chardev?('/dev/tty')
|
51
|
+
File.open('/dev/tty', 'w') { |tty|
|
52
|
+
tty.print important_message
|
53
|
+
}
|
54
|
+
end
|
24
55
|
end
|
25
|
-
end
|
26
56
|
|
27
|
-
|
28
|
-
|
29
|
-
|
57
|
+
message! <<-'EOS'
|
58
|
+
************************************************************************
|
59
|
+
IMPORTANT! gpgme gem uses locally built versions of required C libraries,
|
60
|
+
namely libgpg-error, libassuan, and gpgme.
|
61
|
+
|
62
|
+
If this is a concern for you and you want to use the system library
|
63
|
+
instead, abort this installation process and reinstall gpgme gem as
|
64
|
+
follows:
|
65
|
+
|
66
|
+
gem install gpgme -- --use-system-libraries
|
67
|
+
|
68
|
+
************************************************************************
|
69
|
+
EOS
|
70
|
+
|
71
|
+
require 'rubygems'
|
72
|
+
require 'mini_portile'
|
73
|
+
|
74
|
+
libgpg_error_recipe = MiniPortile.new('libgpg-error', '1.12').tap do |recipe|
|
75
|
+
recipe.target = File.join(ROOT, "ports")
|
76
|
+
recipe.files = ["ftp://ftp.gnupg.org/gcrypt/#{recipe.name}/#{recipe.name}-#{recipe.version}.tar.bz2"]
|
77
|
+
recipe.configure_options = [
|
78
|
+
'--disable-shared',
|
79
|
+
'--enable-static',
|
80
|
+
'--disable-nls',
|
81
|
+
"CFLAGS='-fPIC #{ENV["CFLAGS"]}'",
|
82
|
+
]
|
83
|
+
checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
|
84
|
+
unless File.exist?(checkpoint)
|
85
|
+
recipe.cook
|
86
|
+
FileUtils.touch checkpoint
|
87
|
+
end
|
88
|
+
recipe.activate
|
89
|
+
end
|
30
90
|
|
31
|
-
|
91
|
+
libassuan_recipe = MiniPortile.new('libassuan', '2.1.1').tap do |recipe|
|
92
|
+
recipe.target = File.join(ROOT, "ports")
|
93
|
+
recipe.files = ["ftp://ftp.gnupg.org/gcrypt/#{recipe.name}/#{recipe.name}-#{recipe.version}.tar.bz2"]
|
94
|
+
recipe.configure_options = [
|
95
|
+
'--disable-shared',
|
96
|
+
'--enable-static',
|
97
|
+
"--with-gpg-error-prefix=#{libgpg_error_recipe.path}",
|
98
|
+
"CFLAGS='-fPIC #{ENV["CFLAGS"]}'",
|
99
|
+
]
|
100
|
+
checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
|
101
|
+
unless File.exist?(checkpoint)
|
102
|
+
recipe.cook
|
103
|
+
FileUtils.touch checkpoint
|
104
|
+
end
|
105
|
+
recipe.activate
|
106
|
+
end
|
32
107
|
|
33
|
-
|
34
|
-
|
35
|
-
|
108
|
+
gpgme_recipe = MiniPortile.new('gpgme', '1.4.3').tap do |recipe|
|
109
|
+
recipe.target = File.join(ROOT, "ports")
|
110
|
+
recipe.files = ["ftp://ftp.gnupg.org/gcrypt/#{recipe.name}/#{recipe.name}-#{recipe.version}.tar.bz2"]
|
111
|
+
recipe.configure_options = [
|
112
|
+
'--disable-shared',
|
113
|
+
'--enable-static',
|
114
|
+
"--with-gpg-error-prefix=#{libgpg_error_recipe.path}",
|
115
|
+
"--with-libassuan-prefix=#{libassuan_recipe.path}",
|
116
|
+
"CFLAGS='-fPIC #{ENV["CFLAGS"]}'",
|
117
|
+
]
|
118
|
+
checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
|
119
|
+
unless File.exist?(checkpoint)
|
120
|
+
recipe.cook
|
121
|
+
FileUtils.touch checkpoint
|
122
|
+
end
|
123
|
+
recipe.activate
|
124
|
+
end
|
36
125
|
|
37
|
-
#
|
126
|
+
# special treatment to link with static libraries
|
127
|
+
$libs = $libs.shellsplit.tap {|libs|
|
128
|
+
File.join(gpgme_recipe.path, "bin", "gpgme-config").tap {|config|
|
129
|
+
# call config scripts explicit with 'sh' for compat with Windows
|
130
|
+
$CPPFLAGS = `sh #{config} --cflags`.strip << ' ' << $CPPFLAGS
|
131
|
+
`sh #{config} --libs`.strip.shellsplit.each {|arg|
|
132
|
+
case arg
|
133
|
+
when /\A-L(.+)\z/
|
134
|
+
lpath=$1
|
135
|
+
# Prioritize ports' directories
|
136
|
+
if lpath.start_with?(ROOT + '/')
|
137
|
+
$LIBPATH = [lpath] | $LIBPATH
|
138
|
+
else
|
139
|
+
$LIBPATH = $LIBPATH | [lpath]
|
140
|
+
end
|
141
|
+
when /\A-l./
|
142
|
+
libs.push(arg)
|
143
|
+
else
|
144
|
+
$LDFLAGS << ' ' << arg.shellescape
|
145
|
+
end
|
146
|
+
}
|
147
|
+
}
|
148
|
+
}.shelljoin
|
149
|
+
|
150
|
+
message 'checking for linker flags for static linking... '
|
151
|
+
case
|
152
|
+
when try_link('int main(void) { return 0; }',
|
153
|
+
['-Wl,-Bstatic', '-lgpgme', '-Wl,-Bdynamic'].shelljoin)
|
154
|
+
message "-Wl,-Bstatic\n"
|
155
|
+
|
156
|
+
$libs = $libs.shellsplit.map {|arg|
|
157
|
+
case arg
|
158
|
+
when '-lgpgme', '-lassuan', '-lgpg-error'
|
159
|
+
['-Wl,-Bstatic', arg, '-Wl,-Bdynamic']
|
160
|
+
else
|
161
|
+
arg
|
162
|
+
end
|
163
|
+
}.flatten.shelljoin
|
164
|
+
else
|
165
|
+
message "NONE\n"
|
166
|
+
end
|
38
167
|
|
168
|
+
unless have_header 'gpgme.h'
|
169
|
+
abort <<-EOS
|
170
|
+
************************************************************************
|
171
|
+
ERROR! Cannot locate 'gpgme.h'.
|
172
|
+
************************************************************************
|
173
|
+
EOS
|
174
|
+
end
|
175
|
+
end
|
39
176
|
|
40
|
-
|
41
|
-
|
177
|
+
checking_for('gpgme >= 1.1.3') do
|
178
|
+
if try_run(<<'End')
|
179
|
+
#include <gpgme.h>
|
180
|
+
#include <stdlib.h>
|
181
|
+
int main (void) {
|
182
|
+
return gpgme_check_version ("1.1.3") == NULL;
|
183
|
+
}
|
184
|
+
End
|
185
|
+
true
|
186
|
+
else
|
187
|
+
$CFLAGS += ' -DRUBY_GPGME_NEED_WORKAROUND_KEYLIST_NEXT'
|
188
|
+
false
|
189
|
+
end
|
42
190
|
end
|
43
191
|
|
44
|
-
|
45
|
-
#$LDFLAGS << " -L#{PREFIX}/lib "
|
46
|
-
$CFLAGS << " -fPIC "
|
192
|
+
have_func('gpgme_op_export_keys')
|
47
193
|
|
48
|
-
|
194
|
+
create_makefile ('gpgme_n')
|
49
195
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
exit(1)
|
56
|
-
end
|
196
|
+
if enable_config('clean', true)
|
197
|
+
# Do not clean if run in a development work tree.
|
198
|
+
File.open('Makefile', 'a') { |mk|
|
199
|
+
mk.print <<EOF
|
200
|
+
all: clean-ports
|
57
201
|
|
58
|
-
|
202
|
+
clean-ports: $(DLLIB)
|
203
|
+
-$(Q)$(RUBY) $(srcdir)/extconf.rb --clean
|
204
|
+
EOF
|
205
|
+
}
|
206
|
+
end
|
data/ext/gpgme/gpgme_n.c
CHANGED
@@ -37,6 +37,9 @@
|
|
37
37
|
cases) for that. */
|
38
38
|
|
39
39
|
#include "ruby.h"
|
40
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
41
|
+
#include "ruby/encoding.h"
|
42
|
+
#endif
|
40
43
|
#include "gpgme.h"
|
41
44
|
#include <errno.h>
|
42
45
|
|
@@ -121,6 +124,7 @@ static VALUE cEngineInfo,
|
|
121
124
|
cSignature,
|
122
125
|
cSigNotation,
|
123
126
|
cTrustItem,
|
127
|
+
cRecipient,
|
124
128
|
cDecryptResult,
|
125
129
|
cVerifyResult,
|
126
130
|
cSignResult,
|
@@ -666,6 +670,36 @@ rb_s_gpgme_set_locale (VALUE dummy, VALUE vctx, VALUE vcategory, VALUE vvalue)
|
|
666
670
|
return LONG2NUM(err);
|
667
671
|
}
|
668
672
|
|
673
|
+
#if defined(GPGME_VERSION_NUMBER) && GPGME_VERSION_NUMBER >= 0x010400
|
674
|
+
static VALUE
|
675
|
+
rb_s_gpgme_set_pinentry_mode (VALUE dummy, VALUE vctx, VALUE vmode)
|
676
|
+
{
|
677
|
+
gpgme_ctx_t ctx;
|
678
|
+
gpgme_error_t err;
|
679
|
+
|
680
|
+
UNWRAP_GPGME_CTX(vctx, ctx);
|
681
|
+
if (!ctx)
|
682
|
+
rb_raise (rb_eArgError, "released ctx");
|
683
|
+
|
684
|
+
err = gpgme_set_pinentry_mode (ctx, NUM2INT(vmode));
|
685
|
+
return LONG2NUM(err);
|
686
|
+
}
|
687
|
+
|
688
|
+
static VALUE
|
689
|
+
rb_s_gpgme_get_pinentry_mode (VALUE dummy, VALUE vctx)
|
690
|
+
{
|
691
|
+
gpgme_ctx_t ctx;
|
692
|
+
gpgme_pinentry_mode_t mode;
|
693
|
+
|
694
|
+
UNWRAP_GPGME_CTX(vctx, ctx);
|
695
|
+
if (!ctx)
|
696
|
+
rb_raise (rb_eArgError, "released ctx");
|
697
|
+
|
698
|
+
mode = gpgme_get_pinentry_mode (ctx);
|
699
|
+
return INT2FIX(mode);
|
700
|
+
}
|
701
|
+
#endif
|
702
|
+
|
669
703
|
static VALUE
|
670
704
|
rb_s_gpgme_op_keylist_start (VALUE dummy, VALUE vctx, VALUE vpattern,
|
671
705
|
VALUE vsecret_only)
|
@@ -718,6 +752,16 @@ rb_s_gpgme_op_keylist_ext_start (VALUE dummy, VALUE vctx, VALUE vpattern,
|
|
718
752
|
return LONG2NUM(err);
|
719
753
|
}
|
720
754
|
|
755
|
+
static VALUE
|
756
|
+
utf8_str_new (const char *data)
|
757
|
+
{
|
758
|
+
VALUE string = rb_str_new2 (data);
|
759
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
760
|
+
rb_enc_associate_index (string, rb_enc_find_index ("UTF-8"));
|
761
|
+
#endif
|
762
|
+
return string;
|
763
|
+
}
|
764
|
+
|
721
765
|
static VALUE
|
722
766
|
save_gpgme_key_attrs (VALUE vkey, gpgme_key_t key)
|
723
767
|
{
|
@@ -739,7 +783,7 @@ save_gpgme_key_attrs (VALUE vkey, gpgme_key_t key)
|
|
739
783
|
if (key->issuer_serial)
|
740
784
|
rb_iv_set (vkey, "@issuer_serial", rb_str_new2 (key->issuer_serial));
|
741
785
|
if (key->issuer_name)
|
742
|
-
rb_iv_set (vkey, "@issuer_name",
|
786
|
+
rb_iv_set (vkey, "@issuer_name", utf8_str_new (key->issuer_name));
|
743
787
|
if (key->chain_id)
|
744
788
|
rb_iv_set (vkey, "@chain_id", rb_str_new2 (key->chain_id));
|
745
789
|
rb_iv_set (vkey, "@owner_trust", INT2FIX(key->owner_trust));
|
@@ -771,18 +815,20 @@ save_gpgme_key_attrs (VALUE vkey, gpgme_key_t key)
|
|
771
815
|
rb_iv_set (vkey, "@uids", vuids);
|
772
816
|
for (user_id = key->uids; user_id; user_id = user_id->next)
|
773
817
|
{
|
774
|
-
VALUE vuser_id
|
818
|
+
VALUE vuser_id, vsignatures;
|
819
|
+
gpgme_key_sig_t key_sig;
|
820
|
+
|
821
|
+
vuser_id = rb_class_new_instance(0, NULL, cUserID);
|
775
822
|
rb_iv_set (vuser_id, "@revoked", INT2FIX(user_id->revoked));
|
776
823
|
rb_iv_set (vuser_id, "@invalid", INT2FIX(user_id->invalid));
|
777
824
|
rb_iv_set (vuser_id, "@validity", INT2FIX(user_id->validity));
|
778
|
-
rb_iv_set (vuser_id, "@
|
779
|
-
rb_iv_set (vuser_id, "@
|
780
|
-
rb_iv_set (vuser_id, "@comment",
|
781
|
-
rb_iv_set (vuser_id, "@email",
|
825
|
+
rb_iv_set (vuser_id, "@name", utf8_str_new (user_id->name));
|
826
|
+
rb_iv_set (vuser_id, "@uid", utf8_str_new (user_id->uid));
|
827
|
+
rb_iv_set (vuser_id, "@comment", utf8_str_new (user_id->comment));
|
828
|
+
rb_iv_set (vuser_id, "@email", utf8_str_new (user_id->email));
|
782
829
|
|
783
830
|
vsignatures = rb_ary_new ();
|
784
831
|
rb_iv_set (vuser_id, "@signatures", vsignatures);
|
785
|
-
gpgme_key_sig_t key_sig;
|
786
832
|
for (key_sig = user_id->signatures; key_sig; key_sig = key_sig->next)
|
787
833
|
{
|
788
834
|
VALUE vkey_sig = rb_class_new_instance(0, NULL, cKeySig);
|
@@ -1450,7 +1496,8 @@ rb_s_gpgme_op_decrypt_result (VALUE dummy, VALUE vctx)
|
|
1450
1496
|
{
|
1451
1497
|
gpgme_ctx_t ctx;
|
1452
1498
|
gpgme_decrypt_result_t result;
|
1453
|
-
|
1499
|
+
gpgme_recipient_t recipient;
|
1500
|
+
VALUE vresult, vrecipients;
|
1454
1501
|
|
1455
1502
|
UNWRAP_GPGME_CTX(vctx, ctx);
|
1456
1503
|
if (!ctx)
|
@@ -1462,6 +1509,17 @@ rb_s_gpgme_op_decrypt_result (VALUE dummy, VALUE vctx)
|
|
1462
1509
|
rb_iv_set (vresult, "@unsupported_algorithm",
|
1463
1510
|
rb_str_new2 (result->unsupported_algorithm));
|
1464
1511
|
rb_iv_set (vresult, "@wrong_key_usage", INT2FIX(result->wrong_key_usage));
|
1512
|
+
vrecipients = rb_ary_new ();
|
1513
|
+
rb_iv_set (vresult, "@recipients", vrecipients);
|
1514
|
+
for (recipient = result->recipients; recipient; recipient = recipient->next)
|
1515
|
+
{
|
1516
|
+
VALUE vrecipient = rb_class_new_instance (0, NULL, cRecipient);
|
1517
|
+
rb_iv_set (vrecipient, "@pubkey_algo", INT2FIX(recipient->pubkey_algo));
|
1518
|
+
rb_iv_set (vrecipient, "@keyid", rb_str_new2 (recipient->keyid));
|
1519
|
+
rb_iv_set (vrecipient, "@status", UINT2NUM(recipient->status));
|
1520
|
+
rb_ary_push (vrecipients, vrecipient);
|
1521
|
+
}
|
1522
|
+
rb_iv_set (vresult, "@file_name", rb_str_new2 (result->file_name));
|
1465
1523
|
return vresult;
|
1466
1524
|
}
|
1467
1525
|
|
@@ -1972,6 +2030,8 @@ Init_gpgme_n (void)
|
|
1972
2030
|
rb_define_class_under (mGPGME, "UserID", rb_cObject);
|
1973
2031
|
cKeySig =
|
1974
2032
|
rb_define_class_under (mGPGME, "KeySig", rb_cObject);
|
2033
|
+
cRecipient =
|
2034
|
+
rb_define_class_under (mGPGME, "Recipient", rb_cObject);
|
1975
2035
|
cDecryptResult =
|
1976
2036
|
rb_define_class_under (mGPGME, "DecryptResult", rb_cObject);
|
1977
2037
|
cVerifyResult =
|
@@ -2047,6 +2107,12 @@ Init_gpgme_n (void)
|
|
2047
2107
|
rb_s_gpgme_set_keylist_mode, 2);
|
2048
2108
|
rb_define_module_function (mGPGME, "gpgme_get_keylist_mode",
|
2049
2109
|
rb_s_gpgme_get_keylist_mode, 1);
|
2110
|
+
#if defined(GPGME_VERSION_NUMBER) && GPGME_VERSION_NUMBER >= 0x010400
|
2111
|
+
rb_define_module_function (mGPGME, "gpgme_set_pinentry_mode",
|
2112
|
+
rb_s_gpgme_set_pinentry_mode, 2);
|
2113
|
+
rb_define_module_function (mGPGME, "gpgme_get_pinentry_mode",
|
2114
|
+
rb_s_gpgme_get_pinentry_mode, 1);
|
2115
|
+
#endif
|
2050
2116
|
rb_define_module_function (mGPGME, "gpgme_set_passphrase_cb",
|
2051
2117
|
rb_s_gpgme_set_passphrase_cb, 3);
|
2052
2118
|
rb_define_module_function (mGPGME, "gpgme_get_passphrase_cb",
|
@@ -2625,4 +2691,18 @@ Init_gpgme_n (void)
|
|
2625
2691
|
rb_define_const (mGPGME, "GPGME_ENCRYPT_NO_ENCRYPT_TO",
|
2626
2692
|
INT2FIX(GPGME_ENCRYPT_NO_ENCRYPT_TO));
|
2627
2693
|
#endif
|
2694
|
+
|
2695
|
+
/* These flags were added in 1.4.0. */
|
2696
|
+
#if defined(GPGME_VERSION_NUMBER) && GPGME_VERSION_NUMBER >= 0x010400
|
2697
|
+
rb_define_const (mGPGME, "GPGME_PINENTRY_MODE_DEFAULT",
|
2698
|
+
INT2FIX(GPGME_PINENTRY_MODE_DEFAULT));
|
2699
|
+
rb_define_const (mGPGME, "GPGME_PINENTRY_MODE_ASK",
|
2700
|
+
INT2FIX(GPGME_PINENTRY_MODE_ASK));
|
2701
|
+
rb_define_const (mGPGME, "GPGME_PINENTRY_MODE_CANCEL",
|
2702
|
+
INT2FIX(GPGME_PINENTRY_MODE_CANCEL));
|
2703
|
+
rb_define_const (mGPGME, "GPGME_PINENTRY_MODE_ERROR",
|
2704
|
+
INT2FIX(GPGME_PINENTRY_MODE_ERROR));
|
2705
|
+
rb_define_const (mGPGME, "GPGME_PINENTRY_MODE_LOOPBACK",
|
2706
|
+
INT2FIX(GPGME_PINENTRY_MODE_LOOPBACK));
|
2707
|
+
#endif
|
2628
2708
|
}
|
data/lib/gpgme/constants.rb
CHANGED
@@ -58,6 +58,11 @@ module GPGME
|
|
58
58
|
MD_SHA384 = GPGME_MD_SHA384
|
59
59
|
MD_SHA512 = GPGME_MD_SHA512
|
60
60
|
MD_TIGER = GPGME_MD_TIGER
|
61
|
+
PINENTRY_MODE_DEFAULT = GPGME_PINENTRY_MODE_DEFAULT
|
62
|
+
PINENTRY_MODE_ASK = GPGME_PINENTRY_MODE_ASK
|
63
|
+
PINENTRY_MODE_CANCEL = GPGME_PINENTRY_MODE_CANCEL
|
64
|
+
PINENTRY_MODE_ERROR = GPGME_PINENTRY_MODE_ERROR
|
65
|
+
PINENTRY_MODE_LOOPBACK = GPGME_PINENTRY_MODE_LOOPBACK
|
61
66
|
PK_DSA = GPGME_PK_DSA
|
62
67
|
PK_ELG = GPGME_PK_ELG
|
63
68
|
PK_ELG_E = GPGME_PK_ELG_E
|
@@ -184,4 +189,11 @@ module GPGME
|
|
184
189
|
VALIDITY_ULTIMATE => :ultimate
|
185
190
|
}
|
186
191
|
|
192
|
+
PINENTRY_MODE_NAMES = {
|
193
|
+
PINENTRY_MODE_DEFAULT => :default,
|
194
|
+
PINENTRY_MODE_ASK => :ask,
|
195
|
+
PINENTRY_MODE_CANCEL => :cancel,
|
196
|
+
PINENTRY_MODE_ERROR => :error,
|
197
|
+
PINENTRY_MODE_LOOPBACK => :loopback
|
198
|
+
}
|
187
199
|
end
|
data/lib/gpgme/ctx.rb
CHANGED
@@ -20,6 +20,9 @@ module GPGME
|
|
20
20
|
# * +:textmode+ if +true+, inform the recipient that the input is text.
|
21
21
|
# * +:keylist_mode+ One of: +KEYLIST_MODE_LOCAL+, +KEYLIST_MODE_EXTERN+,
|
22
22
|
# +KEYLIST_MODE_SIGS+ or +KEYLIST_MODE_VALIDATE+.
|
23
|
+
# * +:pinentry_mode+ One of: +PINENTRY_MODE_DEFAULT+,
|
24
|
+
# +PINENTRY_MODE_ASK+, +PINENTRY_MODE_CANCEL+,
|
25
|
+
# +PINENTRY_MODE_ERROR+, or +PINENTRY_MODE_LOOPBACK+.
|
23
26
|
# * +:password+ password of the passphrased password being used.
|
24
27
|
# * +:passphrase_callback+ A callback function. See {#set_passphrase_callback}.
|
25
28
|
# * +:passphrase_callback_value+ An object passed to passphrase_callback.
|
@@ -43,10 +46,11 @@ module GPGME
|
|
43
46
|
raise exc if exc
|
44
47
|
ctx = rctx[0]
|
45
48
|
|
46
|
-
ctx.protocol
|
47
|
-
ctx.armor
|
48
|
-
ctx.textmode
|
49
|
-
ctx.keylist_mode
|
49
|
+
ctx.protocol = options[:protocol] if options[:protocol]
|
50
|
+
ctx.armor = options[:armor] if options[:armor]
|
51
|
+
ctx.textmode = options[:textmode] if options[:textmode]
|
52
|
+
ctx.keylist_mode = options[:keylist_mode] if options[:keylist_mode]
|
53
|
+
ctx.pinentry_mode = options[:pinentry_mode] if options[:pinentry_mode]
|
50
54
|
|
51
55
|
if options[:password]
|
52
56
|
ctx.set_passphrase_callback GPGME::Ctx.method(:pass_function),
|
@@ -138,6 +142,17 @@ module GPGME
|
|
138
142
|
GPGME::gpgme_get_keylist_mode(self)
|
139
143
|
end
|
140
144
|
|
145
|
+
# Change the default behaviour of the pinentry invocation.
|
146
|
+
def pinentry_mode=(mode)
|
147
|
+
GPGME::gpgme_set_pinentry_mode(self, mode)
|
148
|
+
mode
|
149
|
+
end
|
150
|
+
|
151
|
+
# Return the current pinentry mode.
|
152
|
+
def pinentry_mode
|
153
|
+
GPGME::gpgme_get_pinentry_mode(self)
|
154
|
+
end
|
155
|
+
|
141
156
|
##
|
142
157
|
# Passphrase and progress callbacks
|
143
158
|
##
|
@@ -184,6 +199,10 @@ module GPGME
|
|
184
199
|
# $stderr.puts
|
185
200
|
# end
|
186
201
|
#
|
202
|
+
# Note that this function doesn't work with GnuPG 2.0. You can
|
203
|
+
# use either GnuPG 1.x, which can be installed in parallel with
|
204
|
+
# GnuPG 2.0, or GnuPG 2.1, which has loopback pinentry feature (see
|
205
|
+
# {#pinentry_mode}).
|
187
206
|
def set_passphrase_callback(passfunc, hook_value = nil)
|
188
207
|
GPGME::gpgme_set_passphrase_cb(self, passfunc, hook_value)
|
189
208
|
end
|
data/lib/gpgme/data.rb
CHANGED
@@ -68,7 +68,7 @@ module GPGME
|
|
68
68
|
# Create a new instance with internal buffer.
|
69
69
|
def from_str(string)
|
70
70
|
rdh = []
|
71
|
-
err = GPGME::gpgme_data_new_from_mem(rdh, string, string.
|
71
|
+
err = GPGME::gpgme_data_new_from_mem(rdh, string, string.bytesize)
|
72
72
|
exc = GPGME::error_to_exception(err)
|
73
73
|
raise exc if exc
|
74
74
|
rdh.first
|
data/lib/gpgme/misc.rb
CHANGED
@@ -12,10 +12,17 @@ module GPGME
|
|
12
12
|
attr_reader :signatures
|
13
13
|
end
|
14
14
|
|
15
|
+
class Recipient
|
16
|
+
private_class_method :new
|
17
|
+
|
18
|
+
attr_reader :pubkey_algo, :keyid, :status
|
19
|
+
end
|
20
|
+
|
15
21
|
class DecryptResult
|
16
22
|
private_class_method :new
|
17
23
|
|
18
24
|
attr_reader :unsupported_algorithm, :wrong_key_usage
|
25
|
+
attr_reader :recipients, :file_name
|
19
26
|
end
|
20
27
|
|
21
28
|
class SignResult
|
Binary file
|
Binary file
|
Binary file
|
data/test/ctx_test.rb
CHANGED
@@ -37,10 +37,18 @@ describe GPGME::Ctx do
|
|
37
37
|
|
38
38
|
GPGME::Ctx.new(:password => 'gpgme') do |ctx|
|
39
39
|
ctx.decrypt_verify input, output
|
40
|
-
end
|
41
40
|
|
42
|
-
|
43
|
-
|
41
|
+
output.seek 0
|
42
|
+
assert_equal "Hi there", output.read.chomp
|
43
|
+
|
44
|
+
recipients = ctx.decrypt_result.recipients
|
45
|
+
assert_equal 1, recipients.size
|
46
|
+
|
47
|
+
recipient_key = ctx.get_key(recipients.first.keyid)
|
48
|
+
key = ctx.get_key(PASSWORD_KEY[:sha])
|
49
|
+
|
50
|
+
assert_equal recipient_key, key
|
51
|
+
end
|
44
52
|
end
|
45
53
|
end
|
46
54
|
|
@@ -314,7 +322,7 @@ Key-Type: DSA
|
|
314
322
|
Key-Length: 1024
|
315
323
|
Subkey-Type: ELG-E
|
316
324
|
Subkey-Length: 1024
|
317
|
-
Name-Real: Key
|
325
|
+
Name-Real: Key Testér
|
318
326
|
Name-Comment: with some comments
|
319
327
|
Name-Email: test_generation@example.com
|
320
328
|
Expire-Date: 0
|
@@ -322,6 +330,10 @@ Passphrase: wadus
|
|
322
330
|
</GnupgKeyParms>
|
323
331
|
RUBY
|
324
332
|
|
333
|
+
if RUBY_VERSION > "1.9"
|
334
|
+
assert_equal key.encoding, Encoding::UTF_8
|
335
|
+
end
|
336
|
+
|
325
337
|
keys_amount = GPGME::Key.find(:public).size
|
326
338
|
GPGME::Ctx.new do |ctx|
|
327
339
|
ctx.generate_key(key.chomp)
|
@@ -330,6 +342,12 @@ RUBY
|
|
330
342
|
assert_equal keys_amount + 1, GPGME::Key.find(:public).size
|
331
343
|
|
332
344
|
GPGME::Key.find(:public, "test_generation@example.com").each do |k|
|
345
|
+
|
346
|
+
if RUBY_VERSION > "1.9"
|
347
|
+
# Make sure UTF-8 in and UTF-8 out.
|
348
|
+
assert_equal "Key Testér", k.name
|
349
|
+
assert_equal k.name.encoding, Encoding::UTF_8
|
350
|
+
end
|
333
351
|
k.delete!(true)
|
334
352
|
end
|
335
353
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gpgme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Daiki Ueno
|
@@ -10,12 +9,25 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2014-03-13 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mini_portile
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ~>
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.5.0
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.5.0
|
15
28
|
- !ruby/object:Gem::Dependency
|
16
29
|
name: mocha
|
17
30
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
31
|
requirements:
|
20
32
|
- - ~>
|
21
33
|
- !ruby/object:Gem::Version
|
@@ -23,7 +35,6 @@ dependencies:
|
|
23
35
|
type: :development
|
24
36
|
prerelease: false
|
25
37
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
38
|
requirements:
|
28
39
|
- - ~>
|
29
40
|
- !ruby/object:Gem::Version
|
@@ -31,7 +42,6 @@ dependencies:
|
|
31
42
|
- !ruby/object:Gem::Dependency
|
32
43
|
name: minitest
|
33
44
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
45
|
requirements:
|
36
46
|
- - ~>
|
37
47
|
- !ruby/object:Gem::Version
|
@@ -39,7 +49,6 @@ dependencies:
|
|
39
49
|
type: :development
|
40
50
|
prerelease: false
|
41
51
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
52
|
requirements:
|
44
53
|
- - ~>
|
45
54
|
- !ruby/object:Gem::Version
|
@@ -47,7 +56,6 @@ dependencies:
|
|
47
56
|
- !ruby/object:Gem::Dependency
|
48
57
|
name: yard
|
49
58
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
59
|
requirements:
|
52
60
|
- - ~>
|
53
61
|
- !ruby/object:Gem::Version
|
@@ -55,7 +63,6 @@ dependencies:
|
|
55
63
|
type: :development
|
56
64
|
prerelease: false
|
57
65
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
66
|
requirements:
|
60
67
|
- - ~>
|
61
68
|
- !ruby/object:Gem::Version
|
@@ -63,7 +70,6 @@ dependencies:
|
|
63
70
|
- !ruby/object:Gem::Dependency
|
64
71
|
name: rcov
|
65
72
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
73
|
requirements:
|
68
74
|
- - ~>
|
69
75
|
- !ruby/object:Gem::Version
|
@@ -71,34 +77,29 @@ dependencies:
|
|
71
77
|
type: :development
|
72
78
|
prerelease: false
|
73
79
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
80
|
requirements:
|
76
81
|
- - ~>
|
77
82
|
- !ruby/object:Gem::Version
|
78
83
|
version: 0.9.9
|
79
84
|
- !ruby/object:Gem::Dependency
|
80
|
-
name:
|
85
|
+
name: debugger
|
81
86
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
87
|
requirements:
|
84
88
|
- - ~>
|
85
89
|
- !ruby/object:Gem::Version
|
86
|
-
version:
|
90
|
+
version: 1.6.6
|
87
91
|
type: :development
|
88
92
|
prerelease: false
|
89
93
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
94
|
requirements:
|
92
95
|
- - ~>
|
93
96
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
95
|
-
description:
|
96
|
-
|
97
|
+
version: 1.6.6
|
98
|
+
description: |-
|
99
|
+
Ruby-GPGME is a Ruby language binding of GPGME (GnuPG
|
97
100
|
Made Easy). GnuPG Made Easy (GPGME) is a library designed to make access to
|
98
|
-
|
99
101
|
GnuPG easier for applications. It provides a High-Level Crypto API for
|
100
|
-
|
101
|
-
encryption, decryption, signing, signature verification and key management.'
|
102
|
+
encryption, decryption, signing, signature verification and key management.
|
102
103
|
email: ueno@gnu.org
|
103
104
|
executables: []
|
104
105
|
extensions:
|
@@ -122,12 +123,8 @@ files:
|
|
122
123
|
- lib/gpgme/ctx.rb
|
123
124
|
- lib/gpgme/crypto.rb
|
124
125
|
- lib/gpgme/user_id.rb
|
125
|
-
- ext/gpgme/libassuan-2.1.0.tar.bz2
|
126
126
|
- ext/gpgme/gpgme_n.c
|
127
127
|
- ext/gpgme/extconf.rb
|
128
|
-
- ext/gpgme/libgpg-error-1.11.tar.gz
|
129
|
-
- ext/gpgme/libgpg-error-1.11.tar.bz2
|
130
|
-
- ext/gpgme/gpgme-1.4.0.tar.bz2
|
131
128
|
- test/key_test.rb
|
132
129
|
- test/sub_key_test.rb
|
133
130
|
- test/test_helper.rb
|
@@ -145,29 +142,33 @@ files:
|
|
145
142
|
- examples/genkey.rb
|
146
143
|
- examples/keylist.rb
|
147
144
|
- examples/edit.rb
|
145
|
+
- ports/archives/libgpg-error-1.12.tar.bz2
|
146
|
+
- ports/archives/gpgme-1.4.3.tar.bz2
|
147
|
+
- ports/archives/libassuan-2.1.1.tar.bz2
|
148
148
|
homepage: http://github.com/ueno/ruby-gpgme
|
149
|
-
licenses:
|
149
|
+
licenses:
|
150
|
+
- LGPL-2.1+
|
151
|
+
metadata: {}
|
150
152
|
post_install_message:
|
151
153
|
rdoc_options: []
|
152
154
|
require_paths:
|
153
155
|
- lib
|
154
156
|
- ext
|
155
157
|
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
-
none: false
|
157
158
|
requirements:
|
158
|
-
- -
|
159
|
+
- - '>='
|
159
160
|
- !ruby/object:Gem::Version
|
160
161
|
version: '0'
|
161
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - '>='
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
requirements: []
|
168
168
|
rubyforge_project: ruby-gpgme
|
169
|
-
rubygems_version: 1.
|
169
|
+
rubygems_version: 2.1.11
|
170
170
|
signing_key:
|
171
|
-
specification_version:
|
171
|
+
specification_version: 4
|
172
172
|
summary: Ruby binding of GPGME.
|
173
173
|
test_files: []
|
174
|
+
has_rdoc: true
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|