class Encruby::File

Attributes

path[RW]

Public Class Methods

new(path, key, options = {}) click to toggle source
# File lib/encruby/file.rb, line 5
def initialize(path, key, options = {})
  @options, @path = options, Pathname.new(path.to_s)
  @options[:save] ||= @options[:replace]

  case
  when !@path.readable?
    raise Encruby::Error, "Unable to read file: #{path}"
  when !@path.file?
    raise Encruby::Error, "Must be a file: #{path}"
  end

  @crypto = Encruby::Message.new(key)
end

Public Instance Methods

decrypt() click to toggle source
# File lib/encruby/file.rb, line 45
def decrypt
  content   = extract_meta(@path.read)
  unless content[:code] && data = content[:code].split(/^__END__\s*\n/)[1]
    raise Error, "No encrypted content found. You sure this file has been encrypted?"
  end

  hash      = @options[:signature] if @options[:verify]
  response  = @crypto.decrypt(data, hash: hash)
  decrypted, hmac = response[:content], response[:signature]
  shebang   = decrypted.lines[0] if decrypted.lines[0] =~ /^#\!/
  decrypted = decrypted.lines[1..-1].join if shebang

  content   = "#{shebang}#{content[:comments]}#{decrypted}"
  path = save_converted(type: :decrypt, content: content) if @options[:save]
  { signature: hmac, content: content, path: path }
end
encrypt() click to toggle source
# File lib/encruby/file.rb, line 33
def encrypt
  content   = extract_meta(@path.read)
  data      = content[:shebang].to_s + content[:code]
  response  = @crypto.encrypt(data)
  encrypted, hmac = response[:content], response[:signature]
  shebang   = "#{Encruby.shebang}\n" if content[:shebang]

  content = "#{shebang}#{content[:comments]}\n__END__\n#{encrypted}"
  path = save_converted(type: :encrypt, content: content) if @options[:save]
  { signature: hmac, content: content, path: path }
end
save_converted(type: :encrypt, content: nil) click to toggle source
# File lib/encruby/file.rb, line 19
def save_converted(type: :encrypt, content: nil)
  if @options[:replace]
    path = @path
  else
    extension = type == :encrypt ? ".enc" : ".dec"
    path = @path.basename('.*').to_s + extension + @path.extname.to_s
    path = @path.dirname.join(path)
  end
  path.open("w"){|f| f.puts content}
  path.chmod(@path.stat.mode)
  path.chown(@path.stat.uid, @path.stat.gid)
  path
end

Private Instance Methods

extract_meta(content) click to toggle source
# File lib/encruby/file.rb, line 64
def extract_meta(content)
  shebang  = content.lines[0] if content =~ /^#\!/
  code     = content.scan(/^\s+[^\s|#].*/m)[0]
  comments = content.gsub(/^\s+[^\s|#].*/m, '')
  comments = comments.gsub(shebang, '') if shebang
  { shebang: shebang, comments: comments, code: code }
end