From 7758d76206d70bcb8bca2f4ae8a9cf89fae6e228 Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Sun, 11 Feb 2024 15:34:15 -0600 Subject: [PATCH] add change password functionality (#26) --- bin/minisign | 10 ++++++++++ lib/minisign/cli.rb | 10 ++++++++++ spec/minisign/cli_spec.rb | 28 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/bin/minisign b/bin/minisign index 361c5e2..b9f51c1 100755 --- a/bin/minisign +++ b/bin/minisign @@ -12,6 +12,15 @@ op = OptionParser.new do |opts| opts.on('-G') do |g| options[:G] = g end + opts.on('-R') do |r| + options[:R] = r + end + opts.on('-C') do |c| + options[:C] = c + end + opts.on('-W') do |w| + options[:W] = w + end opts.on('-f') do |f| options[:f] = f end @@ -35,3 +44,4 @@ end Minisign::CLI.generate(options) if options[:G] Minisign::CLI.recreate(options) if options[:R] +Minisign::CLI.recreate(options) if options[:C] diff --git a/lib/minisign/cli.rb b/lib/minisign/cli.rb index 5b910f8..26d38f0 100644 --- a/lib/minisign/cli.rb +++ b/lib/minisign/cli.rb @@ -74,5 +74,15 @@ def self.recreate(options) end File.write(public_key, private_key.public_key) end + + def self.change_password(options) + options[:s] || "#{Dir.home}/.minisign/minisign.key" + print 'Password: ' + private_key = Minisign::PrivateKey.new(File.read(options[:s]), prompt) + print 'New Password: ' + new_password = options[:W] ? nil : prompt + private_key.change_password! new_password + File.write(options[:s], private_key) + end end end diff --git a/spec/minisign/cli_spec.rb b/spec/minisign/cli_spec.rb index dcca789..9daf508 100644 --- a/spec/minisign/cli_spec.rb +++ b/spec/minisign/cli_spec.rb @@ -52,4 +52,32 @@ expect(new_public_key).to eq(existing_public_key) end end + + describe '.change_password' do + before do + FileUtils.cp('test/minisign.key', 'test/generated/minisign.key') + @options = { + s: 'test/generated/minisign.key' + } + @old_password = 'password' + end + it 'changes the password for the private key' do + new_password = SecureRandom.uuid + allow(Minisign::CLI).to receive(:prompt).and_return(@old_password, new_password) + Minisign::CLI.change_password(@options) + expect do + Minisign::PrivateKey.new(File.read(@options[:s]), new_password) + end.not_to raise_error + end + + it 'changes the password for the private key without a password' + + it 'removes the password for the private key' do + allow(Minisign::CLI).to receive(:prompt).and_return(@old_password) + Minisign::CLI.change_password(@options.merge({ W: true })) + expect do + Minisign::PrivateKey.new(File.read(@options[:s])) + end.not_to raise_error + end + end end