benburkert-gpgme 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/COPYING +340 -0
- data/COPYING.LESSER +510 -0
- data/Gemfile +6 -0
- data/History.txt +15 -0
- data/Manifest.txt +18 -0
- data/README.rdoc +162 -0
- data/Rakefile +37 -0
- data/THANKS +15 -0
- data/benburkert-gpgme.gemspec +30 -0
- data/examples/edit.rb +77 -0
- data/examples/genkey.rb +55 -0
- data/examples/keylist.rb +6 -0
- data/examples/roundtrip.rb +39 -0
- data/examples/sign.rb +29 -0
- data/examples/verify.rb +6 -0
- data/ext/gpgme/extconf.rb +26 -0
- data/ext/gpgme/gpgme_n.c +2622 -0
- data/lib/gpgme/compat.rb +48 -0
- data/lib/gpgme/constants.rb +187 -0
- data/lib/gpgme/crypto.rb +357 -0
- data/lib/gpgme/ctx.rb +462 -0
- data/lib/gpgme/data.rb +177 -0
- data/lib/gpgme/engine.rb +76 -0
- data/lib/gpgme/error.rb +66 -0
- data/lib/gpgme/io_callbacks.rb +21 -0
- data/lib/gpgme/key.rb +242 -0
- data/lib/gpgme/key_common.rb +43 -0
- data/lib/gpgme/key_sig.rb +35 -0
- data/lib/gpgme/misc.rb +66 -0
- data/lib/gpgme/signature.rb +85 -0
- data/lib/gpgme/sub_key.rb +58 -0
- data/lib/gpgme/user_id.rb +20 -0
- data/lib/gpgme/version.rb +3 -0
- data/lib/gpgme.rb +108 -0
- data/test/crypto_test.rb +242 -0
- data/test/ctx_test.rb +426 -0
- data/test/data_test.rb +116 -0
- data/test/files/testkey_pub.gpg +52 -0
- data/test/files/testkey_sec.gpg +54 -0
- data/test/gpgme_test.rb +12 -0
- data/test/key_test.rb +201 -0
- data/test/signature_test.rb +48 -0
- data/test/sub_key_test.rb +45 -0
- data/test/support/resources.rb +516 -0
- data/test/test_helper.rb +79 -0
- metadata +196 -0
data/README.rdoc
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
= GPGME
|
2
|
+
|
3
|
+
This README is better is better viewed through the YARD formatted documentation:
|
4
|
+
http://rdoc.info/github/mrsimo/gpgme/master/frames for latest github version, or
|
5
|
+
http://rdoc.info/gems/gpgme for latest gem release.
|
6
|
+
|
7
|
+
== History behind this fork
|
8
|
+
|
9
|
+
This project started as my Ruby Mendicant University. The idea is to give an
|
10
|
+
overhaul to the API of this gem. As a relativelly new developer in the ruby
|
11
|
+
world, I found the documentation not very newbie friendly, and the API somewhat
|
12
|
+
different to the kind I'm used to in the ruby world.
|
13
|
+
|
14
|
+
GPG is a very powerful tool, and this gem is implemented using the C bindings,
|
15
|
+
making it very fast, and the only proper way to do it.
|
16
|
+
|
17
|
+
My objectives are as follows:
|
18
|
+
|
19
|
+
* Add test coverage of some type.
|
20
|
+
* Make documentation a little bit more newbie friendly.
|
21
|
+
* Improve the API to be more idiomatic.
|
22
|
+
|
23
|
+
== Requirements
|
24
|
+
|
25
|
+
* Ruby 1.8 or later
|
26
|
+
* GPGME 1.1.2 or later
|
27
|
+
* gpg-agent (optional, but recommended)
|
28
|
+
|
29
|
+
== Installation
|
30
|
+
|
31
|
+
$ gem install gpgme
|
32
|
+
|
33
|
+
== API
|
34
|
+
|
35
|
+
GPGME provides three levels of API. The highest level API is as simple as it
|
36
|
+
gets, the mid level API provides more functionality but might be less
|
37
|
+
user-friendly, and the lowest level API is close to the C interface of GPGME.
|
38
|
+
|
39
|
+
=== The highest level API
|
40
|
+
|
41
|
+
For example, to create a cleartext signature of the plaintext from
|
42
|
+
stdin and write the result to stdout can be written as follows.
|
43
|
+
|
44
|
+
crypto = GPGME::Crypto.new
|
45
|
+
crypto.clearsign $stdin, :output => $stdout
|
46
|
+
|
47
|
+
=== The mid level API
|
48
|
+
|
49
|
+
The same example can be rewritten in the mid level API as follows.
|
50
|
+
|
51
|
+
plain = GPGME::Data.new($stdin)
|
52
|
+
sig = GPGME::Data.new($stdout)
|
53
|
+
GPGME::Ctx.new do |ctx|
|
54
|
+
ctx.sign(plain, sig, GPGME::SIG_MODE_CLEAR)
|
55
|
+
end
|
56
|
+
|
57
|
+
=== The lowest level API
|
58
|
+
|
59
|
+
The same example can be rewritten in the lowest level API as follows.
|
60
|
+
|
61
|
+
ret = []
|
62
|
+
GPGME::gpgme_new(ret)
|
63
|
+
ctx = ret.shift
|
64
|
+
GPGME::gpgme_data_new_from_fd(ret, 0)
|
65
|
+
plain = ret.shift
|
66
|
+
GPGME::gpgme_data_new_from_fd(ret, 1)
|
67
|
+
sig = ret.shift
|
68
|
+
GPGME::gpgme_op_sign(ctx, plain, sig, GPGME::SIG_MODE_CLEAR)
|
69
|
+
|
70
|
+
As you see, it's much harder to write a program in this API than the
|
71
|
+
highest level API. However, if you are already familiar with the C
|
72
|
+
interface of GPGME and want to control detailed behavior of GPGME, it
|
73
|
+
might be useful.
|
74
|
+
|
75
|
+
== Usage
|
76
|
+
|
77
|
+
All the high level methods attack the mid level {GPGME::Ctx} API. It is
|
78
|
+
recommended to read through the #{GPGME::Ctx.new} methods for common options.
|
79
|
+
|
80
|
+
Also, most of the input/output is done via {GPGME::Data} objects that create a
|
81
|
+
common interface for reading/writing to normal strings, or other common
|
82
|
+
objects like files. Read the {GPGME::Data} documentation to understand
|
83
|
+
how it works. Every time the lib needs a {GPGME::Data} object, it will be
|
84
|
+
automatically converted to it.
|
85
|
+
|
86
|
+
=== Crypto
|
87
|
+
|
88
|
+
The {GPGME::Crypto} class has the high level convenience methods to encrypt,
|
89
|
+
decrypt, sign and verify signatures. Here are some examples, but it is
|
90
|
+
recommended to read through the {GPGME::Crypto} class to see all the options.
|
91
|
+
|
92
|
+
* Document encryption via {GPGME::Crypto#encrypt}:
|
93
|
+
crypto = GPGME::Crypto.new
|
94
|
+
crypto.encrypt "Hello world!", :recipients => "someone@example.com"
|
95
|
+
|
96
|
+
* Symmetric encryption:
|
97
|
+
crypto = GPGME::Crypto.new :password => "gpgme"
|
98
|
+
crypto.encrypt "Hello world!", :symmetric => true
|
99
|
+
|
100
|
+
|
101
|
+
* Document decryption via {GPGME::Crypto#decrypt} (including signature verification):
|
102
|
+
crypto.decrypt File.open("text.gpg")
|
103
|
+
|
104
|
+
* Document signing via {GPGME::Crypto#sign}. Also the clearsigning and detached signing.
|
105
|
+
crypto.sign "I hereby proclaim Github the beneficiary of all my money when I die"
|
106
|
+
|
107
|
+
* Sign verification via {GPGME::Crypto#verify}
|
108
|
+
sign = crypto.sign "Some text"
|
109
|
+
data = crypto.verify(sign) { |signature| signature.valid? }
|
110
|
+
|
111
|
+
=== Key
|
112
|
+
|
113
|
+
The {GPGME::Key} object represents a key, and has the high level related
|
114
|
+
methods to work with them and find them, export, import, deletetion and
|
115
|
+
creation.
|
116
|
+
|
117
|
+
* Key listing
|
118
|
+
GPGME::Key.find(:secret, "someone@example.com")
|
119
|
+
# => Returns an array with all the secret keys available in the keychain.
|
120
|
+
# that match "someone@example.com"
|
121
|
+
|
122
|
+
* Key exporting
|
123
|
+
GPGME::Key.export("someone@example.com")
|
124
|
+
# => Returns a {GPGME::Data} object with the exported key.
|
125
|
+
|
126
|
+
key = GPGME::Key.find(:secret, "someone@example.com").first
|
127
|
+
key.export
|
128
|
+
# => Returns a {GPGME::Data} object with the exported key.
|
129
|
+
|
130
|
+
* Key importing
|
131
|
+
GPGME::Key.import(File.open("my.key"))
|
132
|
+
|
133
|
+
* TODO: Key generation
|
134
|
+
|
135
|
+
=== Engine
|
136
|
+
|
137
|
+
Provides three convenience methods to obtain information about the gpg engine
|
138
|
+
one is currently using. For example:
|
139
|
+
|
140
|
+
* Getting current information
|
141
|
+
GPGME::Engine.engine_info.first
|
142
|
+
# => #<GPGME::EngineInfo:0x00000100d4fbd8
|
143
|
+
@file_name="/usr/local/bin/gpg",
|
144
|
+
@protocol=0,
|
145
|
+
@req_version="1.3.0",
|
146
|
+
@version="1.4.11">
|
147
|
+
|
148
|
+
* Changing home directory to work with different settings:
|
149
|
+
GPGME::Engine.home_dir = '/tmp'
|
150
|
+
|
151
|
+
== Contributing
|
152
|
+
|
153
|
+
To run the local test suite you need bundler and gpg:
|
154
|
+
|
155
|
+
bundle
|
156
|
+
rake compile # simple rake task to compile the extension
|
157
|
+
rake # runs the test suite
|
158
|
+
|
159
|
+
== License
|
160
|
+
|
161
|
+
The library itself is licensed under LGPLv2.1+. See the file
|
162
|
+
COPYING.LESSER and each file for copyright and warranty information.
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rake/testtask'
|
5
|
+
require 'rcov/rcovtask'
|
6
|
+
require 'yard'
|
7
|
+
|
8
|
+
|
9
|
+
desc "Re-compile the extensions"
|
10
|
+
task :compile do
|
11
|
+
FileUtils.rm_rf('tmp') if File.directory?('tmp')
|
12
|
+
mkdir 'tmp'
|
13
|
+
|
14
|
+
Dir.chdir('tmp') do
|
15
|
+
system "ruby #{File.dirname(__FILE__)}/ext/gpgme/extconf.rb"
|
16
|
+
system "make"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
task :default => [:test]
|
21
|
+
|
22
|
+
Rake::TestTask.new(:test => :compile) do |t|
|
23
|
+
t.libs << 'test'
|
24
|
+
t.pattern = "test/**/*_test.rb"
|
25
|
+
t.verbose = true
|
26
|
+
end
|
27
|
+
Rake::Task['test'].comment = "Run all tests"
|
28
|
+
|
29
|
+
YARD::Rake::YardocTask.new
|
30
|
+
|
31
|
+
Rcov::RcovTask.new do |t|
|
32
|
+
t.libs << 'test'
|
33
|
+
t.pattern = "test/**/*_test.rb"
|
34
|
+
t.verbose = true
|
35
|
+
t.rcov_opts = ["-x gems"]
|
36
|
+
end
|
37
|
+
|
data/THANKS
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Ruby-GPGME was originally written by Daiki Ueno. Other people
|
2
|
+
contributed by reporting problems, suggesting various improvements or
|
3
|
+
submitting actual code. Here is a list of those people. Help us keep
|
4
|
+
it complete and free of errors.
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
Carl Corliss
|
9
|
+
Jérémie Pierson
|
10
|
+
Kouhei Sutou
|
11
|
+
Kris Nuttycombe
|
12
|
+
Marc Dequènes
|
13
|
+
Rob Pitt
|
14
|
+
Rory McKinley
|
15
|
+
Sam Hall
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'benburkert-gpgme'
|
3
|
+
s.version = '0.1.0'
|
4
|
+
s.authors = ['Daiki Ueno']
|
5
|
+
s.date = '2011-05-09'
|
6
|
+
s.email = 'ueno@unixuser.org'
|
7
|
+
s.extensions = ['ext/gpgme/extconf.rb']
|
8
|
+
s.files = `git ls-files`.split("\n")
|
9
|
+
s.has_rdoc = true
|
10
|
+
s.rubyforge_project = 'ruby-gpgme'
|
11
|
+
s.homepage = 'http://rubyforge.org/projects/ruby-gpgme/'
|
12
|
+
s.require_paths = ['lib', 'ext']
|
13
|
+
s.summary = "Ben Burkert's fork of the Ruby binding of GPGME."
|
14
|
+
s.description = %q{Ruby-GPGME is a Ruby language binding of GPGME (GnuPG
|
15
|
+
Made Easy). GnuPG Made Easy (GPGME) is a library designed to make access to
|
16
|
+
GnuPG easier for applications. It provides a High-Level Crypto API for
|
17
|
+
encryption, decryption, signing, signature verification and key management.}
|
18
|
+
|
19
|
+
s.add_development_dependency "mocha", "~> 0.9.12"
|
20
|
+
s.add_development_dependency "minitest", "~> 2.1.0"
|
21
|
+
s.add_development_dependency "yard", "~> 0.6.7"
|
22
|
+
s.add_development_dependency "rcov", "~> 0.9.9"
|
23
|
+
|
24
|
+
case RUBY_VERSION
|
25
|
+
when "1.9.2"
|
26
|
+
s.add_development_dependency "ruby-debug19" , "~> 0.11.6"
|
27
|
+
else
|
28
|
+
s.add_development_dependency "ruby-debug" , "~> 0.10.4"
|
29
|
+
end
|
30
|
+
end
|
data/examples/edit.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gpgme'
|
3
|
+
|
4
|
+
# If you do not have gpg-agent installed, comment out the following
|
5
|
+
# and set it as :passphrase_callback.
|
6
|
+
#
|
7
|
+
# def passfunc(hook, uid_hint, passphrase_info, prev_was_bad, fd)
|
8
|
+
# $stderr.write("Passphrase for #{uid_hint}: ")
|
9
|
+
# $stderr.flush
|
10
|
+
# begin
|
11
|
+
# system('stty -echo')
|
12
|
+
# io = IO.for_fd(fd, 'w')
|
13
|
+
# io.puts(gets)
|
14
|
+
# io.flush
|
15
|
+
# ensure
|
16
|
+
# (0 ... $_.length).each do |i| $_[i] = ?0 end if $_
|
17
|
+
# system('stty echo')
|
18
|
+
# end
|
19
|
+
# $stderr.puts
|
20
|
+
# end
|
21
|
+
|
22
|
+
unless ENV['GPG_AGENT_INFO']
|
23
|
+
$stderr.puts("gpg-agent is not running. See the comment in #{$0}.")
|
24
|
+
exit(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
unless ENV['GNUPGHOME']
|
28
|
+
$stderr.write('As GNUPGHOME is not set, the generated key pair will be stored into *your* keyring. Really proceed? (y/N) ')
|
29
|
+
$stderr.flush
|
30
|
+
exit(1) unless gets.chomp == 'y'
|
31
|
+
end
|
32
|
+
|
33
|
+
unless ARGV.length == 1
|
34
|
+
$stderr.puts("Usage: #{$0} KEYGRIP")
|
35
|
+
exit(1)
|
36
|
+
end
|
37
|
+
|
38
|
+
def progfunc(hook, what, type, current, total)
|
39
|
+
$stderr.write("#{what}: #{current}/#{total}\r")
|
40
|
+
$stderr.flush
|
41
|
+
end
|
42
|
+
|
43
|
+
def editfunc(hook, status, args, fd)
|
44
|
+
case status
|
45
|
+
when GPGME::GPGME_STATUS_GET_BOOL
|
46
|
+
begin
|
47
|
+
$stderr.write("#{args} (y/n) ")
|
48
|
+
$stderr.flush
|
49
|
+
line = gets
|
50
|
+
end until line =~ /\A\s*[ny]\s*\z/
|
51
|
+
io = IO.for_fd(fd)
|
52
|
+
io.puts(line.strip)
|
53
|
+
io.flush
|
54
|
+
when GPGME::GPGME_STATUS_GET_LINE, GPGME::GPGME_STATUS_GET_HIDDEN
|
55
|
+
$stderr.write("#{args}: ")
|
56
|
+
$stderr.flush
|
57
|
+
line = gets
|
58
|
+
io = IO.for_fd(fd)
|
59
|
+
io.puts(line)
|
60
|
+
io.flush
|
61
|
+
else
|
62
|
+
$stderr.puts([status, args].inspect)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
ctx = GPGME::Ctx.new({:progress_callback => method(:progfunc),
|
67
|
+
# :passphrase_callback => method(:passfunc)
|
68
|
+
})
|
69
|
+
keystr = ARGV.shift
|
70
|
+
keys = ctx.keys(keystr)
|
71
|
+
if keys.empty?
|
72
|
+
$stderr.puts("Can't find key for \"#{keystr}\"")
|
73
|
+
exit(1)
|
74
|
+
end
|
75
|
+
|
76
|
+
$stderr.puts(keys.first.inspect)
|
77
|
+
ctx.edit_key(keys.first, method(:editfunc))
|
data/examples/genkey.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gpgme'
|
3
|
+
|
4
|
+
# If you do not have gpg-agent installed, comment out the following
|
5
|
+
# and set it as :passphrase_callback.
|
6
|
+
#
|
7
|
+
# def passfunc(hook, uid_hint, passphrase_info, prev_was_bad, fd)
|
8
|
+
# $stderr.write("Passphrase for #{uid_hint}: ")
|
9
|
+
# $stderr.flush
|
10
|
+
# begin
|
11
|
+
# system('stty -echo')
|
12
|
+
# io = IO.for_fd(fd, 'w')
|
13
|
+
# io.puts(gets)
|
14
|
+
# io.flush
|
15
|
+
# ensure
|
16
|
+
# (0 ... $_.length).each do |i| $_[i] = ?0 end if $_
|
17
|
+
# system('stty echo')
|
18
|
+
# end
|
19
|
+
# $stderr.puts
|
20
|
+
# end
|
21
|
+
|
22
|
+
unless ENV['GPG_AGENT_INFO']
|
23
|
+
$stderr.puts("gpg-agent is not running. See the comment in #{$0}.")
|
24
|
+
exit(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
unless ENV['GNUPGHOME']
|
28
|
+
$stderr.write('As GNUPGHOME is not set, the generated key pair will be stored into *your* keyring. Really proceed? (y/N) ')
|
29
|
+
$stderr.flush
|
30
|
+
exit(1) unless gets.chomp == 'y'
|
31
|
+
end
|
32
|
+
|
33
|
+
def progfunc(hook, what, type, current, total)
|
34
|
+
$stderr.write("#{what}: #{current}/#{total}\r")
|
35
|
+
$stderr.flush
|
36
|
+
end
|
37
|
+
|
38
|
+
ctx = GPGME::Ctx.new({:progress_callback => method(:progfunc),
|
39
|
+
# :passphrase_callback => method(:passfunc)
|
40
|
+
})
|
41
|
+
|
42
|
+
ctx.genkey(<<'EOF', nil, nil)
|
43
|
+
<GnupgKeyParms format="internal">
|
44
|
+
Key-Type: DSA
|
45
|
+
Key-Length: 1024
|
46
|
+
Subkey-Type: ELG-E
|
47
|
+
Subkey-Length: 1024
|
48
|
+
Name-Real: Joe Tester
|
49
|
+
Name-Comment: with stupid passphrase
|
50
|
+
Name-Email: joe@foo.bar
|
51
|
+
Expire-Date: 0
|
52
|
+
Passphrase: abc
|
53
|
+
</GnupgKeyParms>
|
54
|
+
EOF
|
55
|
+
$stderr.puts
|
data/examples/keylist.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gpgme'
|
3
|
+
|
4
|
+
# If you do not have gpg-agent installed, comment out the following
|
5
|
+
# and set it as :passphrase_callback.
|
6
|
+
#
|
7
|
+
# def passfunc(hook, uid_hint, passphrase_info, prev_was_bad, fd)
|
8
|
+
# $stderr.write("Passphrase for #{uid_hint}: ")
|
9
|
+
# $stderr.flush
|
10
|
+
# begin
|
11
|
+
# system('stty -echo')
|
12
|
+
# io = IO.for_fd(fd, 'w')
|
13
|
+
# io.puts(gets)
|
14
|
+
# io.flush
|
15
|
+
# ensure
|
16
|
+
# (0 ... $_.length).each do |i| $_[i] = ?0 end if $_
|
17
|
+
# system('stty echo')
|
18
|
+
# end
|
19
|
+
# $stderr.puts
|
20
|
+
# end
|
21
|
+
|
22
|
+
unless ENV['GPG_AGENT_INFO']
|
23
|
+
$stderr.puts("gpg-agent is not running. See the comment in #{$0}.")
|
24
|
+
exit(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
plain = 'test test test'
|
28
|
+
puts("Plaintext:\n#{plain}")
|
29
|
+
|
30
|
+
# Perform symmetric encryption on PLAIN.
|
31
|
+
cipher = GPGME::encrypt(nil, plain, {:armor => true,
|
32
|
+
# :passphrase_callback => method(:passfunc)
|
33
|
+
})
|
34
|
+
puts("Ciphertext:\n#{cipher}")
|
35
|
+
|
36
|
+
plain = GPGME::decrypt(cipher, {
|
37
|
+
# :passphrase_callback => method(:passfunc)
|
38
|
+
})
|
39
|
+
puts("Plaintext:\n#{plain}")
|
data/examples/sign.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gpgme'
|
3
|
+
|
4
|
+
# If you do not have gpg-agent installed, comment out the following
|
5
|
+
# and set it as :passphrase_callback.
|
6
|
+
#
|
7
|
+
# def passfunc(hook, uid_hint, passphrase_info, prev_was_bad, fd)
|
8
|
+
# $stderr.write("Passphrase for #{uid_hint}: ")
|
9
|
+
# $stderr.flush
|
10
|
+
# begin
|
11
|
+
# system('stty -echo')
|
12
|
+
# io = IO.for_fd(fd, 'w')
|
13
|
+
# io.puts(gets)
|
14
|
+
# io.flush
|
15
|
+
# ensure
|
16
|
+
# (0 ... $_.length).each do |i| $_[i] = ?0 end if $_
|
17
|
+
# system('stty echo')
|
18
|
+
# end
|
19
|
+
# $stderr.puts
|
20
|
+
# end
|
21
|
+
|
22
|
+
unless ENV['GPG_AGENT_INFO']
|
23
|
+
$stderr.puts("gpg-agent is not running. See the comment in #{$0}.")
|
24
|
+
exit(1)
|
25
|
+
end
|
26
|
+
|
27
|
+
puts GPGME::clearsign('test test test', {
|
28
|
+
# :passphrase_callback => method(:passfunc)
|
29
|
+
})
|
data/examples/verify.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
unless find_executable('gpgme-config')
|
4
|
+
$stderr.puts("gpgme-config not found")
|
5
|
+
exit(1)
|
6
|
+
end
|
7
|
+
|
8
|
+
$CFLAGS += ' ' << `gpgme-config --cflags`.chomp
|
9
|
+
$libs += ' ' << `gpgme-config --libs`.chomp
|
10
|
+
|
11
|
+
checking_for('gpgme >= 1.1.3') do
|
12
|
+
if try_run(<<'End')
|
13
|
+
#include <gpgme.h>
|
14
|
+
#include <stdlib.h>
|
15
|
+
int main (void) {
|
16
|
+
return gpgme_check_version ("1.1.3") == NULL;
|
17
|
+
}
|
18
|
+
End
|
19
|
+
true
|
20
|
+
else
|
21
|
+
$CFLAGS += ' -DRUBY_GPGME_NEED_WORKAROUND_KEYLIST_NEXT'
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
have_func('gpgme_op_export_keys')
|
26
|
+
create_makefile ('gpgme_n')
|