rofi-pass/passed
2015-09-13 15:37:31 +02:00

49 lines
1.2 KiB
Ruby

#!/usr/bin/env ruby
abort("usage: #{$PROGRAM_NAME} <sed options>") if ARGV.empty?
sed_command = ['sed', *ARGV]
PASS_DIR = ENV['PASSWORD_STORE_DIR'] || "#{ENV['HOME']}/.password-store"
def keys(dir)
key_file = "#{dir}/.gpg-id"
return unless File.exist?(key_file)
File.read(key_file).lines.map(&:chomp)
end
def each_entry_with_key(dir = PASS_DIR, keys = nil, &block)
keys = keys(dir) || keys
fail('no encryption keys found') unless keys
Dir[File.join(dir, '*.gpg')].each do |entry|
yield(entry, keys)
end
Dir[File.join(dir, '*/')].each do |subdir|
each_entry_with_key(subdir, keys, &block)
end
end
each_entry_with_key do |entry, keys|
new_content = nil
IO.popen(['gpg', '--batch', '-q', '-d', entry]) do |gpg|
IO.popen(sed_command, 'w+') do |sed|
sed.write gpg.read
sed.close_write
new_content = sed.read
end
end
puts entry
puts new_content
puts 'overwrite? (y/N)'
answer = STDIN.gets
next unless answer && answer.chomp =~ /^y/i
recipients = keys.map { |key| ['-r', key] }.flatten
File.delete(entry)
encrypt_cmd = ['gpg', '--batch', '-q', '-e', '-o', entry, *recipients]
IO.popen(encrypt_cmd, 'w+') do |gpg|
gpg.write(new_content)
end
end