Sha256: 3c5c86b49225060d21ad33878b90b75506f4c9b8f722eb803888bf164f18bad8

Contents?: true

Size: 1.97 KB

Versions: 1

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true

require "attr_extras"

# Shell out to gpg with a a command like this
# gpg --armor --no-default-keyring --keyring keyring.gpg
#     --trust-model always -r 'renalware_test'
#     --output output.xml.enc
#     --encrypt input.xml
#
# Note if you want to see a more verbose output you can add -vv but don't do this here
# as it outputs info to stderr and causes an error to be raised.
#
# Some options may be omitted optional depending on how GPG is set up however as we may use
# more than 1 GPG key on thie server, we are explicitly setting the
# Recipient may be optional e.g. --recipient 'patient view'
class GpgEncryptFolder
  pattr_initialize [:folder!, :options!]

  def call
    Dir.glob(folder.join("*.xml")) do |file|
      GpgEncryptFile.new(file: file, options: options).call
    end
  end
end

class GpgOptions
  attr_reader_initialize [
    :recipient,
    :keyring,
    :homedir,
    :destination_folder
  ]
end

class GpgEncryptFile
  pattr_initialize [:file!, :options!]

  def call
    err = Open3.popen3(gpg_command) do |_stdin, _stdout, stderr|
      stderr.read
    end
    raise "Error encrypting UKRDC files: #{err}, #{gpg_command}" unless err.empty?
  end

  private

  def gpg_command
    @gpg_command ||= GpgCommand.new(file: file, options: options).to_s
  end
end

class GpgCommand
  pattr_initialize [:file!, :options!]

  def to_s
    "gpg --armor --no-default-keyring --trust-model always "\
      "#{keyring} #{homedir} #{recipient} "\
      "-o \"#{encrypted_filename}\" "\
      "--encrypt \"#{file}\""
  end

  def recipient
    options.recipient && "--recipient #{options.recipient}"
  end

  def homedir
    options.homedir && "--homedir #{options.homedir}"
  end

  def keyring
    "--keyring #{options.keyring}"
  end

  def filename_without_extension
    File.basename(file, ".xml")
  end

  def output_filename
    "#{filename_without_extension}.gpg"
  end

  def encrypted_filename
    options.destination_folder.join(output_filename)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
renalware-core-2.0.56 lib/gpg_encrypt_folder.rb