Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/dotgpg/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ class Cli < Thor
desc "init [DIRECTORY]", "create a new dotgpg directory"
option :"new-key", type: :boolean, desc: "Force creating a new key", aliases: ["-n"]
option :email, type: :string, desc: "Use a specific email address", aliases: ["-e"]
# User can supply fingerprint with --fingerprint or -f, but if GPGKEY env variable is set use that.
option :fingerprint, type: :string, desc: "Search for a specific fingerprint", aliases: ["-f"], default: if ENV.has_key?('GPGKEY'); ENV['GPGKEY']; else nil; end
def init(directory=".")
return if helped?

Expand All @@ -16,7 +18,7 @@ def init(directory=".")
fail "#{directory}/.gpg already exists"
end

key = Dotgpg::Key.secret_key(options[:email], options[:"new-key"])
key = Dotgpg::Key.secret_key(options[:email], options[:"new-key"], options[:fingerprint])

info "Initializing new dotgpg directory"
info " #{directory}/README.md" unless File.exist? 'README.md'
Expand Down
29 changes: 22 additions & 7 deletions lib/dotgpg/key.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ def self.read(file)
end.flatten.first
end

def self.secret_key(email=nil, force_new=nil)
new.secret_key(email, force_new)
def self.secret_key(email=nil, force_new=nil, fingerprint=nil)
new.secret_key(email, force_new, fingerprint)
end

def secret_key(email=nil, force_new=nil)
existing = existing_key(email)
def secret_key(email=nil, force_new=nil, fingerprint=nil)
existing = existing_key(email, fingerprint)
if existing && !force_new
existing
else
Expand All @@ -22,9 +22,24 @@ def secret_key(email=nil, force_new=nil)

private

def existing_key(email=nil)
existing_private_keys.detect do |k|
email.nil? || k.email == email
def existing_key(email=nil, fingerprint=nil)
# User can specify an Email address or a fingerprint on the command line, to
# use in searching for a matching GPG key. If finterprint is specified
# it takes priority as it is more specific. Must handle either or both
# search parameters being nil.
#
if ! fingerprint.nil?
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor style: in ruby no space between ! and the argument: if !fingerprint.nil?

existing_private_keys.detect do |k|
# Match user-supplied fingerprint at END of key's fingerprint string,
# as users often use a shortened fingerprint.
/#{fingerprint}$/.match(k.fingerprint)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kozmikyak What is GPGKEY usually set to? I suspect you want to detect k.fingerprint.ends_with(fingerprint) instead of converting it to a regex

end
elsif ! email.nil?
existing_private_keys.detect do |k|
k.email == email
end
else
nil
end
end

Expand Down