Rakefile in enmail-0.1.0 vs Rakefile in enmail-0.2.0

- old
+ new

@@ -1,6 +1,125 @@ +# (c) Copyright 2018 Ribose Inc. +# + require "bundler/gem_tasks" require "rspec/core/rake_task" +require "tempfile" + RSpec::Core::RakeTask.new(:spec) task :default => :spec + +namespace :pgp_keys do + def init_homedir_if_missing + return if Dir.exists?(TMP_PGP_HOME) + + FileUtils.mkdir_p(TMP_PGP_HOME) + + File.write(File.join(TMP_PGP_HOME, "gpg.conf"), <<~GPGCONF) + personal-digest-preferences SHA512 + GPGCONF + + File.write(File.join(TMP_PGP_HOME, "gpg-agent.conf"), <<~AGENTCONF) + default-cache-ttl 0 + AGENTCONF + end + + def execute_gpg(*options) + init_homedir_if_missing + common_options = ["--no-permission-warning", "--homedir", TMP_PGP_HOME] + cmd = ["gpg", *common_options, *options] + system(*cmd) + end + + # Available parameters for unattended GPG key generation are described here: + # https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html + def generate_pgp_keys(key_params) + Tempfile.create("gnupg-key-params") do |key_params_file| + key_params_file.write(key_params) + key_params_file.close + execute_gpg("--batch", "--gen-key", in: key_params_file.path) + end + end + + desc "Lists keys in tmp/pgp_home" + task :list => :prepare do + execute_gpg "--list-keys" + end + + desc "Stops all GPG daemons, and deletes tmp/pgp_home" + task :clear => :prepare do + if File.exists?(TMP_PGP_HOME) + system "gpgconf", "--homedir", TMP_PGP_HOME, "--kill", "all" + FileUtils.remove_entry_secure TMP_PGP_HOME + end + end + + desc "Clears tmp/pgp_home, and generates new set of keys" + task :regenerate => %i[clear generate] + + desc "Generates keys in tmp/pgp_home" + task :generate => :prepare do + # Key pairs without password + generate_pgp_keys(<<~KEY_PARAMS) + %no-protection + Key-Type: RSA + Key-Usage: sign, cert + Key-Length: 2048 + Subkey-Type: RSA + Subkey-Length: 2048 + Subkey-Usage: encrypt + Name-Real: Some Arbitrary Key + Name-Email: whatever@example.test + Name-Comment: Without passphrase + Expire-Date: 0 + KEY_PARAMS + + generate_pgp_keys(<<~KEY_PARAMS) + %no-protection + Key-Type: RSA + Key-Usage: sign, cert + Key-Length: 2048 + Subkey-Type: RSA + Subkey-Length: 2048 + Subkey-Usage: encrypt + Name-Real: Cato Elder + Name-Email: cato.elder@example.test + Name-Comment: Without passphrase + Expire-Date: 0 + KEY_PARAMS + + generate_pgp_keys(<<~KEY_PARAMS) + %no-protection + Key-Type: RSA + Key-Usage: sign, cert + Key-Length: 2048 + Subkey-Type: RSA + Subkey-Length: 2048 + Subkey-Usage: encrypt + Name-Real: Roman Senate + Name-Email: senate@example.test + Name-Comment: Without passphrase + Expire-Date: 0 + KEY_PARAMS + + # Password-protected key pairs + generate_pgp_keys(<<~KEY_PARAMS) + Key-Type: RSA + Key-Usage: sign, cert + Key-Length: 2048 + Subkey-Type: RSA + Subkey-Length: 2048 + Subkey-Usage: encrypt + Name-Real: Cato Elder + Name-Email: cato.elder+pwd@example.test + Name-Comment: Password-protected + Expire-Date: 0 + Passphrase: 1234 + KEY_PARAMS + end +end + +task :prepare do + require_relative "./spec/support/0_tmp_pgp_home" +end