aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/gpg.rb
blob: 83b525b44452da20866959520b379ee420869382 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
require "utils"

class Gpg
  def self.find_gpg(executable)
    which_all(executable).detect do |gpg|
      gpg_short_version = Utils.popen_read(gpg, "--version")[/\d\.\d/, 0]
      next unless gpg_short_version
      gpg_version = Version.create(gpg_short_version.to_s)
      @version = gpg_version
      gpg_version >= Version.create("2.0")
    end
  end

  def self.executable
    find_gpg("gpg") || find_gpg("gpg2")
  end

  def self.available?
    File.executable?(executable.to_s)
  end

  def self.version
    @version if available?
  end

  def self.create_test_key(path)
    odie "No GPG present to test against!" unless available?

    (path/"batch.gpg").write <<~EOS
      Key-Type: RSA
      Key-Length: 2048
      Subkey-Type: RSA
      Subkey-Length: 2048
      Name-Real: Testing
      Name-Email: testing@foo.bar
      Expire-Date: 1d
      %no-protection
      %commit
    EOS
    system executable, "--batch", "--gen-key", "batch.gpg"
  end

  def self.cleanup_test_processes!
    odie "No GPG present to test against!" unless available?
    gpgconf = Pathname.new(executable).parent/"gpgconf"

    system gpgconf, "--kill", "gpg-agent"
    system gpgconf, "--homedir", "keyrings/live", "--kill",
                                 "gpg-agent"
  end

  def self.test(path)
    create_test_key(path)
    begin
      yield
    ensure
      cleanup_test_processes!
    end
  end
end