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