email handling for gpg keys
This commit is contained in:
parent
41c96c45f2
commit
0e3d3d60ba
3 changed files with 47 additions and 2 deletions
|
@ -28,8 +28,7 @@ class GpgKey < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def emails
|
||||
raw_key = GPGME::Key.get(fingerprint)
|
||||
raw_key.uids.map(&:email)
|
||||
Gitlab::Gpg::CurrentKeyChain.emails(fingerprint)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -2,6 +2,14 @@ module Gitlab
|
|||
module Gpg
|
||||
extend self
|
||||
|
||||
module CurrentKeyChain
|
||||
extend self
|
||||
|
||||
def emails(fingerprint)
|
||||
GPGME::Key.find(:public, fingerprint).flat_map { |raw_key| raw_key.uids.map(&:email) }
|
||||
end
|
||||
end
|
||||
|
||||
def fingerprints_from_key(key)
|
||||
using_tmp_keychain do
|
||||
import = GPGME::Key.import(key)
|
||||
|
@ -12,6 +20,18 @@ module Gitlab
|
|||
end
|
||||
end
|
||||
|
||||
def emails_from_key(key)
|
||||
using_tmp_keychain do
|
||||
import = GPGME::Key.import(key)
|
||||
|
||||
return [] if import.imported == 0
|
||||
|
||||
fingerprints = import.imports.map(&:fingerprint)
|
||||
|
||||
GPGME::Key.find(:public, fingerprints).flat_map { |raw_key| raw_key.uids.map(&:email) }
|
||||
end
|
||||
end
|
||||
|
||||
def add_to_keychain(key)
|
||||
GPGME::Key.import(key)
|
||||
end
|
||||
|
|
|
@ -15,6 +15,20 @@ describe Gitlab::Gpg do
|
|||
end
|
||||
end
|
||||
|
||||
describe '.emails_from_key' do
|
||||
it 'returns the emails' do
|
||||
expect(
|
||||
described_class.emails_from_key(GpgHelpers::User1.public_key)
|
||||
).to eq GpgHelpers::User1.emails
|
||||
end
|
||||
|
||||
it 'returns an empty array when the key is invalid' do
|
||||
expect(
|
||||
described_class.emails_from_key('bogus')
|
||||
).to eq []
|
||||
end
|
||||
end
|
||||
|
||||
describe '.add_to_keychain', :gpg do
|
||||
it 'stores the key in the keychain' do
|
||||
expect(GPGME::Key.find(:public, GpgHelpers::User1.fingerprint)).to eq []
|
||||
|
@ -36,3 +50,15 @@ describe Gitlab::Gpg do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe Gitlab::Gpg::CurrentKeyChain, :gpg do
|
||||
describe '.emails' do
|
||||
it 'returns the emails' do
|
||||
Gitlab::Gpg.add_to_keychain(GpgHelpers::User2.public_key)
|
||||
|
||||
expect(
|
||||
described_class.emails(GpgHelpers::User2.fingerprint)
|
||||
).to match_array GpgHelpers::User2.emails
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue