Commit 0e3d3d60 authored by Alexis Reigel's avatar Alexis Reigel

email handling for gpg keys

parent 41c96c45
...@@ -28,8 +28,7 @@ class GpgKey < ActiveRecord::Base ...@@ -28,8 +28,7 @@ class GpgKey < ActiveRecord::Base
end end
def emails def emails
raw_key = GPGME::Key.get(fingerprint) Gitlab::Gpg::CurrentKeyChain.emails(fingerprint)
raw_key.uids.map(&:email)
end end
private private
......
...@@ -2,6 +2,14 @@ module Gitlab ...@@ -2,6 +2,14 @@ module Gitlab
module Gpg module Gpg
extend self 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) def fingerprints_from_key(key)
using_tmp_keychain do using_tmp_keychain do
import = GPGME::Key.import(key) import = GPGME::Key.import(key)
...@@ -12,6 +20,18 @@ module Gitlab ...@@ -12,6 +20,18 @@ module Gitlab
end end
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) def add_to_keychain(key)
GPGME::Key.import(key) GPGME::Key.import(key)
end end
......
...@@ -15,6 +15,20 @@ describe Gitlab::Gpg do ...@@ -15,6 +15,20 @@ describe Gitlab::Gpg do
end end
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 describe '.add_to_keychain', :gpg do
it 'stores the key in the keychain' do it 'stores the key in the keychain' do
expect(GPGME::Key.find(:public, GpgHelpers::User1.fingerprint)).to eq [] expect(GPGME::Key.find(:public, GpgHelpers::User1.fingerprint)).to eq []
...@@ -36,3 +50,15 @@ describe Gitlab::Gpg do ...@@ -36,3 +50,15 @@ describe Gitlab::Gpg do
end end
end 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment