123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- class Token < ApplicationModel
- before_create :generate_token
- belongs_to :user, optional: true
- store :preferences
- def self.check(data)
-
- token = Token.find_by(action: data[:action], token: data[:token])
- return if !token
- token.user if token.check?(data)
- end
-
-
-
-
-
-
-
-
- def check?(data = {})
- if !persistent && created_at < 1.day.ago
- destroy
- return false
- end
-
- return false if !data[:inactive_user] && persistent && user.active == false
-
- return false if data[:permission] && !permissions?(data[:permission])
- true
- end
- def self.cleanup
- Token.where('persistent IS ? AND created_at < ?', nil, 30.days.ago).delete_all
- true
- end
- def permissions
- Permission.where(
- name: Array(preferences[:permission]),
- active: true,
- )
- end
- def permissions?(permissions)
- permissions!(permissions)
- true
- rescue Exceptions::Forbidden
- false
- end
- def permissions!(auth_query)
- return true if effective_user.permissions?(auth_query) && Auth::RequestCache.permissions?(self, auth_query)
- raise Exceptions::Forbidden, __('Not authorized (token)!')
- end
-
-
-
- def with_context(user:, &block)
- @effective_user = user
- instance_eval(&block) if block
- ensure
- @effective_user = nil
- end
-
-
-
-
-
-
-
- def self.fetch(action_name, user_id = UserInfo.current_user_id)
- token = where(action: action_name, user_id: user_id).first
- token if token&.check?
- end
-
-
-
-
-
-
- def self.ensure_token!(action_name, user_id = UserInfo.current_user_id, persistent: false)
- instance = fetch(action_name, user_id)
- return instance.token if instance.present?
- create!(action: action_name, user_id: user_id, persistent: persistent).token
- end
-
-
-
-
-
-
- def self.renew_token!(action_name, user_id = UserInfo.current_user_id, persistent: false)
- instance = fetch(action_name, user_id)
- return create(action: action_name, user_id: user_id, persistent: persistent).token if !instance
- instance.renew_token!
- end
-
-
-
- def renew_token!
- generate_token
- save!
- token
- end
- private
- def generate_token
- loop do
- self.token = SecureRandom.urlsafe_base64(48)
- break if !Token.exists?(token: token)
- end
- true
- end
-
- def effective_user
- @effective_user || user
- end
- end
|