X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/fc100474c5d74b20b2576bd3a8f633746c0c6fb2..926625e0650d6e055ee098798694af3006ae34a9:/services/api/app/models/authorized_key.rb diff --git a/services/api/app/models/authorized_key.rb b/services/api/app/models/authorized_key.rb index afb33e60f8..a6bc06593a 100644 --- a/services/api/app/models/authorized_key.rb +++ b/services/api/app/models/authorized_key.rb @@ -7,6 +7,8 @@ class AuthorizedKey < ArvadosModel belongs_to :authorized_user, :foreign_key => :authorized_user_uuid, :class_name => 'User', :primary_key => :uuid + validate :public_key_must_be_unique + api_accessible :user, extend: :common do |t| t.add :name t.add :key_type @@ -28,4 +30,21 @@ class AuthorizedKey < ArvadosModel # Default = deny. false end + + def public_key_must_be_unique + if self.public_key + key = /^ssh-(rsa|dss) [A-Za-z0-9+\/=\+]+\b/.match(self.public_key) + + if not key + errors.add(:public_key, "does not appear to be a valid ssh-rsa or dsa public key") + else + # Valid if no other rows have this public key + if self.class.where('public_key like ?', "%#{key[0]}%").any? + errors.add(:public_key, "already exists in the database, use a different key.") + return false + end + end + end + return true + end end