debian-mirror-gitlab/app/models/key.rb

97 lines
2 KiB
Ruby
Raw Normal View History

2014-09-02 18:07:02 +05:30
require 'digest/md5'
class Key < ActiveRecord::Base
2015-04-26 12:48:37 +05:30
include Sortable
2014-09-02 18:07:02 +05:30
2017-08-17 22:00:37 +05:30
LAST_USED_AT_REFRESH_TIME = 1.day.to_i
2014-09-02 18:07:02 +05:30
2017-08-17 22:00:37 +05:30
belongs_to :user
2014-09-02 18:07:02 +05:30
2017-08-17 22:00:37 +05:30
before_validation :generate_fingerprint
validates :title,
presence: true,
length: { maximum: 255 }
validates :key,
presence: true,
length: { maximum: 5000 },
format: { with: /\A(ssh|ecdsa)-.*\Z/ }
validates :fingerprint,
uniqueness: true,
presence: { message: 'cannot be generated' }
2014-09-02 18:07:02 +05:30
delegate :name, :email, to: :user, prefix: true
2017-09-10 17:25:29 +05:30
after_commit :add_to_shell, on: :create
after_commit :notify_user, on: :create
2015-04-26 12:48:37 +05:30
after_create :post_create_hook
2017-09-10 17:25:29 +05:30
after_commit :remove_from_shell, on: :destroy
2015-04-26 12:48:37 +05:30
after_destroy :post_destroy_hook
2014-09-02 18:07:02 +05:30
2017-08-17 22:00:37 +05:30
def key=(value)
2017-09-10 17:25:29 +05:30
value&.delete!("\n\r")
2017-08-17 22:00:37 +05:30
value.strip! unless value.blank?
write_attribute(:key, value)
2014-09-02 18:07:02 +05:30
end
2015-09-11 14:41:01 +05:30
def publishable_key
2016-09-13 17:45:13 +05:30
# Strip out the keys comment so we don't leak email addresses
# Replace with simple ident of user_name (hostname)
self.key.split[0..1].push("#{self.user_name} (#{Gitlab.config.gitlab.host})").join(' ')
2015-09-11 14:41:01 +05:30
end
2014-09-02 18:07:02 +05:30
# projects that has this key
def projects
user.authorized_projects
end
def shell_id
"key-#{id}"
end
2017-08-17 22:00:37 +05:30
def update_last_used_at
lease = Gitlab::ExclusiveLease.new("key_update_last_used_at:#{id}", timeout: LAST_USED_AT_REFRESH_TIME)
return unless lease.try_obtain
UseKeyWorker.perform_async(id)
end
2014-09-02 18:07:02 +05:30
def add_to_shell
GitlabShellWorker.perform_async(
:add_key,
shell_id,
key
)
end
2015-04-26 12:48:37 +05:30
def post_create_hook
SystemHooksService.new.execute_hooks_for(self, :create)
end
2014-09-02 18:07:02 +05:30
def remove_from_shell
GitlabShellWorker.perform_async(
:remove_key,
shell_id,
2017-09-10 17:25:29 +05:30
key
2014-09-02 18:07:02 +05:30
)
end
2015-04-26 12:48:37 +05:30
def post_destroy_hook
SystemHooksService.new.execute_hooks_for(self, :destroy)
end
2014-09-02 18:07:02 +05:30
private
2015-04-26 12:48:37 +05:30
def generate_fingerprint
2014-09-02 18:07:02 +05:30
self.fingerprint = nil
2015-04-26 12:48:37 +05:30
return unless self.key.present?
self.fingerprint = Gitlab::KeyFingerprint.new(self.key).fingerprint
2014-09-02 18:07:02 +05:30
end
2017-08-17 22:00:37 +05:30
def notify_user
2017-09-10 17:25:29 +05:30
NotificationService.new.new_key(self)
2017-08-17 22:00:37 +05:30
end
2014-09-02 18:07:02 +05:30
end