Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/gpg_key.rb3
-rw-r--r--lib/gitlab/gpg.rb20
-rw-r--r--spec/lib/gitlab/gpg_spec.rb26
3 files changed, 47 insertions, 2 deletions
diff --git a/app/models/gpg_key.rb b/app/models/gpg_key.rb
index a9f1400650c..146ca2f2705 100644
--- a/app/models/gpg_key.rb
+++ b/app/models/gpg_key.rb
@@ -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
diff --git a/lib/gitlab/gpg.rb b/lib/gitlab/gpg.rb
index 64f18d00e46..73a4b691cff 100644
--- a/lib/gitlab/gpg.rb
+++ b/lib/gitlab/gpg.rb
@@ -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
diff --git a/spec/lib/gitlab/gpg_spec.rb b/spec/lib/gitlab/gpg_spec.rb
index 6cfc634e2d9..2a55e7d89de 100644
--- a/spec/lib/gitlab/gpg_spec.rb
+++ b/spec/lib/gitlab/gpg_spec.rb
@@ -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