X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d6cc9d6e055974384be446f6da8218ff7da048ae..29d73c8ab33b0d9c34074cd09e581cd7584da31e:/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..452cd6967b 100644 --- a/services/api/app/models/authorized_key.rb +++ b/services/api/app/models/authorized_key.rb @@ -1,5 +1,5 @@ class AuthorizedKey < ArvadosModel - include AssignUuid + include HasUuid include KindAndEtag include CommonApiTemplate before_create :permission_to_set_authorized_user_uuid @@ -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,22 @@ class AuthorizedKey < ArvadosModel # Default = deny. false end + + def public_key_must_be_unique + if self.public_key + valid_key = SSHKey.valid_ssh_public_key? self.public_key + + if not valid_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('uuid != ? and public_key like ?', + uuid || '', "%#{self.public_key}%").any? + errors.add(:public_key, "already exists in the database, use a different key.") + return false + end + end + end + return true + end end