summaryrefslogtreecommitdiff
path: root/lib/gitlab/ssh_public_key.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/ssh_public_key.rb')
-rw-r--r--lib/gitlab/ssh_public_key.rb52
1 files changed, 21 insertions, 31 deletions
diff --git a/lib/gitlab/ssh_public_key.rb b/lib/gitlab/ssh_public_key.rb
index 2df31bcc246..a3f8730fb04 100644
--- a/lib/gitlab/ssh_public_key.rb
+++ b/lib/gitlab/ssh_public_key.rb
@@ -1,31 +1,20 @@
module Gitlab
class SSHPublicKey
- TYPES = %w[rsa dsa ecdsa ed25519].freeze
-
- Technology = Struct.new(:name, :allowed_sizes)
+ Technology = Struct.new(:name, :key_class, :supported_sizes)
Technologies = [
- Technology.new('rsa', [1024, 2048, 3072, 4096]),
- Technology.new('dsa', [1024, 2048, 3072]),
- Technology.new('ecdsa', [256, 384, 521]),
- Technology.new('ed25519', [256])
+ Technology.new(:rsa, OpenSSL::PKey::RSA, [1024, 2048, 3072, 4096]),
+ Technology.new(:dsa, OpenSSL::PKey::DSA, [1024, 2048, 3072]),
+ Technology.new(:ecdsa, OpenSSL::PKey::EC, [256, 384, 521]),
+ Technology.new(:ed25519, Net::SSH::Authentication::ED25519::PubKey, [256])
].freeze
- def self.technology_names
- Technologies.map(&:name)
- end
-
def self.technology(name)
- Technologies.find { |ssh_key_technology| ssh_key_technology.name == name }
+ Technologies.find { |tech| tech.name.to_s == name.to_s }
end
- private_class_method :technology
- def self.allowed_sizes(name)
- technology(name).allowed_sizes
- end
-
- def self.allowed_type?(type)
- technology_names.include?(type.to_s)
+ def self.supported_sizes(name)
+ technology(name)&.supported_sizes
end
attr_reader :key_text, :key
@@ -50,18 +39,7 @@ module Gitlab
def type
return unless valid?
- case key
- when OpenSSL::PKey::EC
- :ecdsa
- when OpenSSL::PKey::RSA
- :rsa
- when OpenSSL::PKey::DSA
- :dsa
- when Net::SSH::Authentication::ED25519::PubKey
- :ed25519
- else
- raise "Unsupported key type: #{key.class}"
- end
+ technology.name
end
def bits
@@ -80,5 +58,17 @@ module Gitlab
raise "Unsupported key type: #{type}"
end
end
+
+ private
+
+ def technology
+ @technology ||=
+ begin
+ tech = Technologies.find { |tech| key.is_a?(tech.key_class) }
+ raise "Unsupported key type: #{key.class}" unless tech
+
+ tech
+ end
+ end
end
end