To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

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