lib/rultor/encrypt.rb
# 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