Merged updates from trunk into stable branch
[feedcatcher.git] / vendor / rails / activesupport / lib / active_support / message_verifier.rb
1 module ActiveSupport
2 # MessageVerifier makes it easy to generate and verify messages which are signed
3 # to prevent tampering.
4 #
5 # This is useful for cases like remember-me tokens and auto-unsubscribe links where the
6 # session store isn't suitable or available.
7 #
8 # Remember Me:
9 # cookies[:remember_me] = @verifier.generate([@user.id, 2.weeks.from_now])
10 #
11 # In the authentication filter:
12 #
13 # id, time = @verifier.verify(cookies[:remember_me])
14 # if time < Time.now
15 # self.current_user = User.find(id)
16 # end
17 #
18 class MessageVerifier
19 class InvalidSignature < StandardError; end
20
21 def initialize(secret, digest = 'SHA1')
22 @secret = secret
23 @digest = digest
24 end
25
26 def verify(signed_message)
27 data, digest = signed_message.split("--")
28 if digest != generate_digest(data)
29 raise InvalidSignature
30 else
31 Marshal.load(ActiveSupport::Base64.decode64(data))
32 end
33 end
34
35 def generate(value)
36 data = ActiveSupport::Base64.encode64s(Marshal.dump(value))
37 "#{data}--#{generate_digest(data)}"
38 end
39
40 private
41 def generate_digest(data)
42 require 'openssl' unless defined?(OpenSSL)
43 OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(@digest), @secret, data)
44 end
45 end
46 end