diff options
| -rw-r--r-- | users/app/models/token.rb | 36 | ||||
| -rw-r--r-- | users/test/factories.rb | 4 | ||||
| -rw-r--r-- | users/test/unit/token_test.rb | 23 | 
3 files changed, 48 insertions, 15 deletions
| diff --git a/users/app/models/token.rb b/users/app/models/token.rb index dd87344..001eb40 100644 --- a/users/app/models/token.rb +++ b/users/app/models/token.rb @@ -11,6 +11,25 @@ class Token < CouchRest::Model::Base    validates :user_id, presence: true +  design do +    view :by_last_seen_at +  end + +  def self.expires_after +    APP_CONFIG[:auth] && APP_CONFIG[:auth][:token_expires_after] +  end + +  def self.expired +    return [] unless expires_after +    by_last_seen_at.endkey(expires_after.minutes.ago) +  end + +  def self.destroy_all_expired +    self.expired.each do |token| +      token.destroy +    end +  end +    def authenticate      if expired?        destroy @@ -27,21 +46,16 @@ class Token < CouchRest::Model::Base    end    def expired? -    expires_after and -    last_seen_at + expires_after.minutes < Time.now -  end - -  def expires_after -    APP_CONFIG[:auth] && APP_CONFIG[:auth][:token_expires_after] +    Token.expires_after and +    last_seen_at < Token.expires_after.minutes.ago    end    def initialize(*args)      super -    self.id = SecureRandom.urlsafe_base64(32).gsub(/^_*/, '') -    self.last_seen_at = Time.now -  end - -  design do +    if new_record? +      self.id = SecureRandom.urlsafe_base64(32).gsub(/^_*/, '') +      self.last_seen_at = Time.now +    end    end  end diff --git a/users/test/factories.rb b/users/test/factories.rb index c87e290..f5fb77d 100644 --- a/users/test/factories.rb +++ b/users/test/factories.rb @@ -19,6 +19,8 @@ FactoryGirl.define do      end    end -  factory :token +  factory :token do +    user +  end  end diff --git a/users/test/unit/token_test.rb b/users/test/unit/token_test.rb index f56c576..6c9f209 100644 --- a/users/test/unit/token_test.rb +++ b/users/test/unit/token_test.rb @@ -7,9 +7,6 @@ class ClientCertificateTest < ActiveSupport::TestCase      @user = find_record :user    end -  teardown do -  end -    test "new token for user" do      sample = Token.new(:user_id => @user.id)      assert sample.valid? @@ -61,6 +58,26 @@ class ClientCertificateTest < ActiveSupport::TestCase      end    end +  test "Token.destroy_all_expired is noop if no expiry is set" do +    expired = FactoryGirl.create :token, last_seen_at: 2.hours.ago +    with_config auth: {} do +      Token.destroy_all_expired +    end +    assert_equal expired, Token.find(expired.id) +  end + +  test "Token.destroy_all_expired cleans up expired tokens only" do +    expired = FactoryGirl.create :token, last_seen_at: 2.hours.ago +    fresh = FactoryGirl.create :token +    with_config auth: {token_expires_after: 60} do +      Token.destroy_all_expired +    end +    assert_nil Token.find(expired.id) +    assert_equal fresh, Token.find(fresh.id) +    fresh.destroy +  end + +  end | 
