Validate fingerprint uniqueness
This commit is contained in:
parent
656d800f8c
commit
aa0473d0eb
2 changed files with 13 additions and 15 deletions
|
@ -21,11 +21,11 @@ class Key < ActiveRecord::Base
|
|||
|
||||
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 :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
|
||||
|
||||
|
@ -33,15 +33,6 @@ class Key < ActiveRecord::Base
|
|||
self.key = key.strip unless key.blank?
|
||||
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
|
||||
def projects
|
||||
user.authorized_projects
|
||||
|
@ -54,6 +45,9 @@ class Key < ActiveRecord::Base
|
|||
private
|
||||
|
||||
def generate_fingerpint
|
||||
self.fingerprint = nil
|
||||
return unless key.present?
|
||||
|
||||
cmd_status = 0
|
||||
cmd_output = ''
|
||||
Tempfile.open('gitlab_key_file') do |file|
|
||||
|
@ -66,9 +60,6 @@ class Key < ActiveRecord::Base
|
|||
cmd_output.gsub /([\d\h]{2}:)+[\d\h]{2}/ do |match|
|
||||
self.fingerprint = match
|
||||
end
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -42,10 +42,17 @@ describe Key do
|
|||
build(:key, user: user).should be_valid
|
||||
end
|
||||
|
||||
it "does not accepts the key twice" do
|
||||
it "does not accept the exact same key twice" do
|
||||
create(:key, user: user)
|
||||
build(:key, user: user).should_not be_valid
|
||||
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
|
||||
|
||||
context "validate it is a fingerprintable key" do
|
||||
|
|
Loading…
Reference in a new issue