Commit b98f414a authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'key_uniqueness' of /home/git/repositories/gitlab/gitlabhq

parents dcac37d9 aa0473d0
...@@ -21,11 +21,11 @@ class Key < ActiveRecord::Base ...@@ -21,11 +21,11 @@ class Key < ActiveRecord::Base
attr_accessible :key, :title attr_accessible :key, :title
before_validation :strip_white_space before_validation :strip_white_space, :generate_fingerpint
validates :title, presence: true, length: { within: 0..255 } validates :title, presence: true, length: { within: 0..255 }
validates :key, presence: true, length: { within: 0..5000 }, format: { with: /\A(ssh|ecdsa)-.*\Z/ }, uniqueness: true validates :key, presence: true, length: { within: 0..5000 }, format: { with: /\A(ssh|ecdsa)-.*\Z/ }, uniqueness: true
validate :fingerprintable_key validates :fingerprint, uniqueness: true, presence: { message: 'cannot be generated' }
delegate :name, :email, to: :user, prefix: true delegate :name, :email, to: :user, prefix: true
...@@ -33,15 +33,6 @@ class Key < ActiveRecord::Base ...@@ -33,15 +33,6 @@ class Key < ActiveRecord::Base
self.key = key.strip unless key.blank? self.key = key.strip unless key.blank?
end end
def fingerprintable_key
return true unless key # Don't test if there is no key.
unless generate_fingerpint
errors.add(:key, "can't be fingerprinted")
false
end
end
# projects that has this key # projects that has this key
def projects def projects
user.authorized_projects user.authorized_projects
...@@ -54,26 +45,21 @@ class Key < ActiveRecord::Base ...@@ -54,26 +45,21 @@ class Key < ActiveRecord::Base
private private
def generate_fingerpint def generate_fingerpint
self.fingerprint = nil
return unless key.present?
cmd_status = 0 cmd_status = 0
cmd_output = '' cmd_output = ''
file = Tempfile.new('gitlab_key_file') Tempfile.open('gitlab_key_file') do |file|
begin
file.puts key file.puts key
file.rewind file.rewind
cmd_output, cmd_status = popen("ssh-keygen -lf #{file.path}", '/tmp') cmd_output, cmd_status = popen("ssh-keygen -lf #{file.path}", '/tmp')
ensure
file.close
file.unlink # deletes the temp file
end end
if cmd_status.zero? if cmd_status.zero?
cmd_output.gsub /([\d\h]{2}:)+[\d\h]{2}/ do |match| cmd_output.gsub /([\d\h]{2}:)+[\d\h]{2}/ do |match|
self.fingerprint = match self.fingerprint = match
end end
true
else
false
end end
end end
end end
...@@ -42,17 +42,22 @@ describe Key do ...@@ -42,17 +42,22 @@ describe Key do
build(:key, user: user).should be_valid build(:key, user: user).should be_valid
end end
it "does not accepts the key twice" do it "does not accept the exact same key twice" do
create(:key, user: user) create(:key, user: user)
build(:key, user: user).should_not be_valid build(:key, user: user).should_not be_valid
end end
it "does not accept a duplicate key with a different comment" do
create(:key, user: user)
duplicate = build(:key, user: user)
duplicate.key << ' extra comment'
duplicate.should_not be_valid
end
end end
context "validate it is a fingerprintable key" do context "validate it is a fingerprintable key" do
let(:user) { create(:user) }
it "accepts the fingerprintable key" do it "accepts the fingerprintable key" do
build(:key, user: user).should be_valid build(:key).should be_valid
end end
it "rejects the unfingerprintable key (contains space in middle)" do it "rejects the unfingerprintable key (contains space in middle)" do
......
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