yegor256/rultor-remote

View on GitHub
lib/rultor/encrypt.rb

Summary

Maintainability
A
0 mins
Test Coverage
# encoding: utf-8
#
# Copyright (c) 2009-2017, rultor.com
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met: 1) Redistributions of source code must retain the above
# copyright notice, this list of conditions and the following
# disclaimer. 2) Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution. 3) Neither the name of the rultor.com nor
# the names of its contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
# OF THE POSSIBILITY OF SUCH DAMAGE.

require 'shellwords'
require 'English'

# Rultor main module.
# Author:: Yegor Bugayenko (yegor256@gmail.com)
# Copyright:: Copyright (c) 2014 Yegor Bugayenko
# License:: BSD
module Rultor
  # Encrypting command
  class Encrypt
    def initialize(name, file)
      @key = 'rultor-key:' + name
      @dir = File.dirname(file)
      @file = File.basename(file)
    end

    def run
      source = File.join(@dir, @file)
      target = File.join(@dir, @file + '.asc')
      if Gem.win_platform?
        windows(source, target)
      else
        unix(source, target)
      end
      fail 'PGP encryption failed' unless $CHILD_STATUS.exitstatus == 0
      Rultor.log.info "#{@file} encrypted into #{target}" \
        " (#{File.size(target)} bytes)"
    end

    private

    def unix(source, target)
      system(
        "
        set -x
        set -e
        file=#{Shellwords.escape(source)}
        asc=#{Shellwords.escape(target)}
        if [ -e \"${asc}\" ]; then
          echo \"file already exists: ${asc}\"
          exit -1
        fi
        tmp=$(mktemp -t rultor-XXXX)
        rm -f \"${tmp}\"
        gpg --version
        gpg --symmetric --armor --verbose --batch --no-tty \
          --passphrase #{Shellwords.escape(@key)} \
          -o \"${tmp}\" \"${file}\"
        gpg --keyserver hkp://ipv4.pool.sks-keyservers.net \
          --verbose --recv-keys 9AF0FA4C
        gpg --trust-model always \
          --output \"${asc}\" \
          --batch --no-tty --armor --encrypt --verbose \
          --recipient 9AF0FA4C \"${tmp}\"
        rm -f \"${tmp}\"
        "
      )
    end

    def windows(source, target)
      tmp = source + '.enc'
      system(
        [
          'gpg --version',
          'gpg --symmetric --armor --verbose --batch --no-tty' \
            " --passphrase #{Shellwords.escape(@key)}" \
            " -o #{Shellwords.escape(tmp)}" \
            " #{Shellwords.escape(source)}",
          'gpg --keyserver hkp://ipv4.pool.sks-keyservers.net' \
            ' --verbose --recv-keys 9AF0FA4C',
          'gpg --trust-model always' \
            " --output #{Shellwords.escape(target)}" \
            ' --batch --no-tty --armor --encrypt --verbose' \
            " --recipient 9AF0FA4C #{Shellwords.escape(tmp)}"
        ].join(' && ')
      )
      File.delete(tmp)
    end
  end
end