token.rb
85 lines
| 2.6 KiB
| text/x-ruby
|
RubyLexer
|
r2678 | # Redmine - project management software | ||
|
r13490 | # Copyright (C) 2006-2015 Jean-Philippe Lang | ||
|
r10 | # | ||
# This program is free software; you can redistribute it and/or | ||||
# modify it under the terms of the GNU General Public License | ||||
# as published by the Free Software Foundation; either version 2 | ||||
# of the License, or (at your option) any later version. | ||||
|
r6388 | # | ||
|
r10 | # This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
# GNU General Public License for more details. | ||||
|
r6388 | # | ||
|
r10 | # You should have received a copy of the GNU General Public License | ||
# along with this program; if not, write to the Free Software | ||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
class Token < ActiveRecord::Base | ||||
belongs_to :user | ||||
|
r2642 | validates_uniqueness_of :value | ||
|
r13100 | attr_protected :id | ||
|
r6388 | |||
|
r7308 | before_create :delete_previous_tokens, :generate_new_token | ||
|
r6388 | |||
|
r13300 | cattr_accessor :validity_time | ||
self.validity_time = 1.day | ||||
|
r6388 | |||
|
r7308 | def generate_new_token | ||
|
r10 | self.value = Token.generate_token_value | ||
end | ||||
|
r6388 | # Return true if token has expired | ||
|
r10 | def expired? | ||
|
r13300 | return Time.now > self.created_on + self.class.validity_time | ||
|
r10 | end | ||
|
r6388 | |||
|
r10 | # Delete all expired tokens | ||
def self.destroy_expired | ||||
|
r13300 | Token.where("action NOT IN (?) AND created_on < ?", ['feeds', 'api'], Time.now - validity_time).delete_all | ||
|
r10 | end | ||
|
r6388 | |||
|
r11066 | # Returns the active user who owns the key for the given action | ||
def self.find_active_user(action, key, validity_days=nil) | ||||
|
r11144 | user = find_user(action, key, validity_days) | ||
if user && user.active? | ||||
user | ||||
end | ||||
end | ||||
# Returns the user who owns the key for the given action | ||||
def self.find_user(action, key, validity_days=nil) | ||||
token = find_token(action, key, validity_days) | ||||
if token | ||||
token.user | ||||
end | ||||
end | ||||
# Returns the token for action and key with an optional | ||||
# validity duration (in number of days) | ||||
def self.find_token(action, key, validity_days=nil) | ||||
|
r11066 | action = action.to_s | ||
key = key.to_s | ||||
|
r11144 | return nil unless action.present? && key =~ /\A[a-z0-9]+\z/i | ||
|
r11066 | |||
|
r11144 | token = Token.where(:action => action, :value => key).first | ||
if token && (token.action == action) && (token.value == key) && token.user | ||||
|
r11067 | if validity_days.nil? || (token.created_on > validity_days.days.ago) | ||
|
r11144 | token | ||
|
r11066 | end | ||
end | ||||
end | ||||
|
r10 | def self.generate_token_value | ||
|
r8951 | Redmine::Utils.random_hex(20) | ||
|
r10 | end | ||
|
r6388 | |||
|
r11066 | private | ||
|
r2678 | # Removes obsolete tokens (same user and action) | ||
def delete_previous_tokens | ||||
if user | ||||
|
r13300 | Token.where(:user_id => user.id, :action => action).delete_all | ||
|
r2678 | end | ||
end | ||||
|
r10 | end | ||