63 lines
1.6 KiB
Ruby
63 lines
1.6 KiB
Ruby
class RemoteStorageAuthorization < ApplicationRecord
|
|
belongs_to :user
|
|
|
|
serialize :permissions
|
|
|
|
validates_presence_of :permissions
|
|
validates_presence_of :client_id
|
|
|
|
scope :valid, -> { where(expire_at: nil).or(where(expire_at: (DateTime.now)..)) }
|
|
scope :expired, -> { where(expire_at: ..(DateTime.now)) }
|
|
|
|
after_initialize do |a|
|
|
a.permissions = [] if a.permissions == nil
|
|
end
|
|
|
|
before_create :generate_token
|
|
before_create :store_token_in_redis
|
|
after_create :schedule_token_expiry
|
|
before_destroy :delete_token_from_redis
|
|
after_destroy :remove_token_expiry_job
|
|
|
|
def url
|
|
if self.redirect_uri
|
|
uri = URI.parse self.redirect_uri
|
|
"#{uri.scheme}://#{client_id}"
|
|
else
|
|
"http://#{client_id}"
|
|
end
|
|
end
|
|
|
|
def delete_token_from_redis
|
|
key = "rs:authorizations:#{user.address}:#{token}"
|
|
redis.srem? key, redis.smembers(key)
|
|
end
|
|
|
|
private
|
|
|
|
def redis
|
|
@redis ||= Redis.new(url: Setting.redis_url)
|
|
end
|
|
|
|
def generate_token(length=16)
|
|
self.token = SecureRandom.hex(length) if self.token.blank?
|
|
end
|
|
|
|
def store_token_in_redis
|
|
redis.sadd "rs:authorizations:#{user.address}:#{token}", permissions
|
|
end
|
|
|
|
def schedule_token_expiry
|
|
return unless expire_at.present?
|
|
ExpireRemoteStorageAuthorizationJob.set(wait_unil: expire_at).perform_later(id)
|
|
end
|
|
|
|
def remove_token_expiry_job
|
|
queue = Sidekiq::Queue.new(ExpireRemoteStorageAuthorizationJob.queue_name)
|
|
queue.each do |job|
|
|
next unless job.display_class == "ExpireRemoteStorageAuthorizationJob"
|
|
job.delete if job.display_args == [id]
|
|
end
|
|
end
|
|
end
|