Skip to content

Instantly share code, notes, and snippets.

@KazW

KazW/db_store.rb

Forked from alexyoung/db_store.rb
Created Apr 26, 2013
Embed
What would you like to do?
require 'openid/store/interface'
module OpenID::Store
class Association
include Mongoid::Document
field :secret, :type => Binary
def from_record
OpenID::Association.new(handle, secret.to_s, issued, lifetime, assoc_type)
end
end
class Nonce
include Mongoid::Document
end
class DbStore < OpenID::Store::Interface
def self.cleanup_nonces
now = Time.now.to_i
Nonce.delete_all(["timestamp > ? OR timestamp < ?", now + OpenID::Nonce.skew, now - OpenID::Nonce.skew])
end
def self.cleanup_associations
now = Time.now.to_i
Association.delete_all(['issued + lifetime > ?',now])
end
def store_association(server_url, assoc)
remove_association(server_url, assoc.handle)
# BSON::Binary is used because secrets raise an exception
# due to character encoding
Association.create(:server_url => server_url,
:handle => assoc.handle,
:secret => BSON::Binary.new(assoc.secret),
:issued => assoc.issued,
:lifetime => assoc.lifetime,
:assoc_type => assoc.assoc_type)
end
def get_association(server_url, handle = nil)
assocs = if handle.blank?
Association.find :all, :conditions => { :server_url => server_url }
else
Association.find :all, :conditions => { :server_url => server_url, :handle => handle }
end
assocs.reverse.each do |assoc|
a = assoc.from_record
if a.expires_in == 0
assoc.destroy
else
return a
end
end if assocs.any?
return nil
end
def remove_association(server_url, handle)
Association.find(:all, :conditions => { :server_url => server_url, :handle => handle }).each do |assoc|
assoc.destroy!
end
end
def use_nonce(server_url, timestamp, salt)
return false if Nonce.find(:first, :conditions => { :server_url => server_url, :timestamp => timestamp, :salt => salt})
return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew
Nonce.create(:server_url => server_url, :timestamp => timestamp, :salt => salt)
return true
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment