To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / .svn / pristine / 2f / 2fb2c04645c15a567f773c73750f1da4ba45dfba.svn-base @ 1298:4f746d8966dd
History | View | Annotate | Download (2.15 KB)
| 1 |
require 'digest/sha1' |
|---|---|
| 2 |
require 'openid/store/interface' |
| 3 |
|
| 4 |
module OpenIdAuthentication |
| 5 |
class MemCacheStore < OpenID::Store::Interface |
| 6 |
def initialize(*addresses) |
| 7 |
@connection = ActiveSupport::Cache::MemCacheStore.new(addresses) |
| 8 |
end |
| 9 |
|
| 10 |
def store_association(server_url, assoc) |
| 11 |
server_key = association_server_key(server_url) |
| 12 |
assoc_key = association_key(server_url, assoc.handle) |
| 13 |
|
| 14 |
assocs = @connection.read(server_key) || {}
|
| 15 |
assocs[assoc.issued] = assoc_key |
| 16 |
|
| 17 |
@connection.write(server_key, assocs) |
| 18 |
@connection.write(assoc_key, assoc, :expires_in => assoc.lifetime) |
| 19 |
end |
| 20 |
|
| 21 |
def get_association(server_url, handle = nil) |
| 22 |
if handle |
| 23 |
@connection.read(association_key(server_url, handle)) |
| 24 |
else |
| 25 |
server_key = association_server_key(server_url) |
| 26 |
assocs = @connection.read(server_key) |
| 27 |
return if assocs.nil? |
| 28 |
|
| 29 |
last_key = assocs[assocs.keys.sort.last] |
| 30 |
@connection.read(last_key) |
| 31 |
end |
| 32 |
end |
| 33 |
|
| 34 |
def remove_association(server_url, handle) |
| 35 |
server_key = association_server_key(server_url) |
| 36 |
assoc_key = association_key(server_url, handle) |
| 37 |
assocs = @connection.read(server_key) |
| 38 |
|
| 39 |
return false unless assocs && assocs.has_value?(assoc_key) |
| 40 |
|
| 41 |
assocs = assocs.delete_if { |key, value| value == assoc_key }
|
| 42 |
|
| 43 |
@connection.write(server_key, assocs) |
| 44 |
@connection.delete(assoc_key) |
| 45 |
|
| 46 |
return true |
| 47 |
end |
| 48 |
|
| 49 |
def use_nonce(server_url, timestamp, salt) |
| 50 |
return false if @connection.read(nonce_key(server_url, salt)) |
| 51 |
return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew |
| 52 |
@connection.write(nonce_key(server_url, salt), timestamp, :expires_in => OpenID::Nonce.skew) |
| 53 |
return true |
| 54 |
end |
| 55 |
|
| 56 |
private |
| 57 |
def association_key(server_url, handle = nil) |
| 58 |
"openid_association_#{digest(server_url)}_#{digest(handle)}"
|
| 59 |
end |
| 60 |
|
| 61 |
def association_server_key(server_url) |
| 62 |
"openid_association_server_#{digest(server_url)}"
|
| 63 |
end |
| 64 |
|
| 65 |
def nonce_key(server_url, salt) |
| 66 |
"openid_nonce_#{digest(server_url)}_#{digest(salt)}"
|
| 67 |
end |
| 68 |
|
| 69 |
def digest(text) |
| 70 |
Digest::SHA1.hexdigest(text) |
| 71 |
end |
| 72 |
end |
| 73 |
end |