Skip to content

Commit

Permalink
Merge branch 'master' of git://github.com/courtenay/tender_multipass …
Browse files Browse the repository at this point in the history
…into courtenay/master

Conflicts:

	README
	lib/tender/multi_pass.rb
	lib/tender/multi_pass_methods.rb
	test/tender_multipass_test.rb
  • Loading branch information
xaviershay committed Feb 6, 2009
2 parents 83ef27f + 12bc254 commit 4671ad1
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 13 deletions.
8 changes: 7 additions & 1 deletion README
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,13 @@ class SessionsController
end
end

If you want to have Tender redirect to your site's login form and can't/don't want to use domain cookies you can just pass the variables in the URL.
You can also set the user's name, instead of using their email address as the key. Set the name of the field
as the final parameter.

user.tender_multipass(cookies, 1.week.from_now.to_i, :full_name)

If you want to have Tender redirect to your site's login form and can't/don't want to use domain cookies you
can just pass the variables in the URL.

Tender -> click "login" -> goes to your site -> returns to Tender with URL params

Expand Down
14 changes: 10 additions & 4 deletions lib/tender/multi_pass.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,26 @@ def initialize(user)
end

# Sets tender cookie values on the given cookie jar.
def create(cookies, options = {})
def create(cookies, options = {}, name_field = nil)
return nil if self.class.site_key.nil?
expires = (options.delete(:expires) || 1.week.from_now).to_i # we want unix time
cookies[:tender_email] = cookie_value(@user.email)
cookies[:tender_expires] = cookie_value(expires)
cookies[:tender_hash] = cookie_value(expiring_token(expires))

options.each do |key, value|
cookies[:"tender_#{key}"] = cookie_value(value)
end

if name_field
name_field = cookies[:tender_name] = cookie_value(@user.send(name_field))
end

cookies[:tender_hash] = cookie_value(expiring_token(expires, name_field))
cookies
end

def expiring_token(expires)
generate_hmac("#{self.class.support_domain}/#{@user.email}/#{expires}")
def expiring_token(expires, name_field=nil)
generate_hmac([self.class.support_domain, @user.email, expires, name_field].compact.join("/"))
end

def expire(cookies)
Expand Down
8 changes: 2 additions & 6 deletions lib/tender/multi_pass_methods.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def self.included(base)
base.extend ClassMethods
end

def tender_multipass(cookies, options = {})
def tender_multipass(cookies, options = nil, name_field = nil)
default_options = \
if multipass = self.class.tender_multipass
multipass.call(self)
Expand All @@ -22,11 +22,7 @@ def tender_multipass(cookies, options = {})
options = {:expires => options}
end

Tender::MultiPass.new(self).create(cookies, default_options.merge(options))
end

def tender_expire(cookies)
Tender::MultiPass.new(self).expire(cookies)
Tender::MultiPass.new(self).create(cookies, default_options.merge(options), name_field)
end

def tender_expire(cookies)
Expand Down
30 changes: 28 additions & 2 deletions test/tender_multipass_test.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require File.join(File.dirname(__FILE__), 'test_helper')

module Tender
class TestUser < Struct.new(:email)
class TestUser < Struct.new(:email, :name)
include Tender::MultiPassMethods
end

Expand Down Expand Up @@ -33,7 +33,7 @@ def assert_cookie(cookie, expected)

class TenderMultipassTest < Test::Unit::TestCase
def setup
@user = Tender::TestUser.new("seaguy@hero.com")
@user = Tender::TestUser.new("seaguy@hero.com", "Joe Seaguy")
@cookies = {}
@user.tender_multipass(@cookies, 1234)
end
Expand Down Expand Up @@ -117,10 +117,36 @@ def test_tender_email_cookie_is_set
def test_tender_expires_cookie_is_set
assert_cookie @cookies[:tender_expires], :value => "1234", :domain => Tender::MultiPass.cookie_domain
end

def test_tender_name_not_required
@user.tender_multipass(@cookies, 1234)
@user = Tender::TestUser.new("seaguy@hero.com")
assert_nil @cookies[:tender_name]
end

def test_tender_hash_cookie_is_set
digest = OpenSSL::Digest::Digest.new("SHA1")
hash = OpenSSL::HMAC.hexdigest(digest, Tender::MultiPass.site_key, "#{Tender::MultiPass.support_domain}/#{@user.email}/1234")
assert_cookie @cookies[:tender_email], :value => @user.email, :domain => Tender::MultiPass.cookie_domain
end

end

class TenderMultipassWithNameTest < Test::Unit::TestCase
def setup
@user = Tender::TestUser.new("seaguy@hero.com", "Sea Guy")
@cookies = {}
@user.tender_multipass(@cookies, 1234, :name)
end

def test_tender_name_is_set
assert_equal({ :value => "Sea Guy", :domain => Tender::MultiPass.cookie_domain }, @cookies[:tender_name])
end


def test_tender_hash_cookie_is_set
digest = OpenSSL::Digest::Digest.new("SHA1")
hash = OpenSSL::HMAC.hexdigest(digest, Tender::MultiPass.site_key, "#{Tender::MultiPass.support_domain}/#{@user.email}/1234/Sea Guy")
assert_equal @cookies[:tender_email], :value => @user.email, :domain => Tender::MultiPass.cookie_domain
end
end

0 comments on commit 4671ad1

Please sign in to comment.