authpwn_rails 0.10.2 → 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/app/models/credentials/facebook.rb +1 -1
- data/authpwn_rails.gemspec +3 -1
- data/legacy/migrate_09_to_010.rb +27 -6
- data/lib/authpwn_rails.rb +1 -0
- data/lib/authpwn_rails/generators/templates/user.rb +3 -0
- data/lib/authpwn_rails/user_extensions/facebook_fields.rb +65 -0
- data/lib/authpwn_rails/user_model.rb +0 -20
- data/test/email_field_test.rb +0 -1
- data/test/facebook_controller_test.rb +11 -0
- data/test/facebook_credential_test.rb +3 -14
- data/test/facebook_fields_test.rb +61 -0
- metadata +18 -16
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.10.
|
1
|
+
0.10.3
|
@@ -36,9 +36,9 @@ class Facebook < ::Credential
|
|
36
36
|
User.transaction do
|
37
37
|
user = User.create!
|
38
38
|
credential = self.new
|
39
|
+
user.credentials << credential
|
39
40
|
credential.facebook_uid = uid
|
40
41
|
credential.access_token = access_token
|
41
|
-
credential.user = user
|
42
42
|
credential.save!
|
43
43
|
end
|
44
44
|
end
|
data/authpwn_rails.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "authpwn_rails"
|
8
|
-
s.version = "0.10.
|
8
|
+
s.version = "0.10.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Victor Costan"]
|
@@ -53,6 +53,7 @@ Gem::Specification.new do |s|
|
|
53
53
|
"lib/authpwn_rails/session_controller.rb",
|
54
54
|
"lib/authpwn_rails/test_extensions.rb",
|
55
55
|
"lib/authpwn_rails/user_extensions/email_field.rb",
|
56
|
+
"lib/authpwn_rails/user_extensions/facebook_fields.rb",
|
56
57
|
"lib/authpwn_rails/user_extensions/password_field.rb",
|
57
58
|
"lib/authpwn_rails/user_model.rb",
|
58
59
|
"test/cookie_controller_test.rb",
|
@@ -60,6 +61,7 @@ Gem::Specification.new do |s|
|
|
60
61
|
"test/email_field_test.rb",
|
61
62
|
"test/facebook_controller_test.rb",
|
62
63
|
"test/facebook_credential_test.rb",
|
64
|
+
"test/facebook_fields_test.rb",
|
63
65
|
"test/helpers/application_controller.rb",
|
64
66
|
"test/helpers/autoload_path.rb",
|
65
67
|
"test/helpers/db_setup.rb",
|
data/legacy/migrate_09_to_010.rb
CHANGED
@@ -20,12 +20,29 @@ Kernel.system "rake db:migrate:up VERSION=20100725000003 RAILS_ENV=#{Rails.env}"
|
|
20
20
|
# Build up credentials.
|
21
21
|
reload!
|
22
22
|
User.all.each do |user|
|
23
|
-
|
23
|
+
unless /\@graph\.facebook\.com$/ =~ user.email
|
24
|
+
eml = Credentials::Email.new :email => user.attributes['email']
|
25
|
+
eml.user = user
|
26
|
+
eml.save!
|
27
|
+
end
|
24
28
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
+
if user.password_hash
|
30
|
+
pwd = Credentials::Password.new
|
31
|
+
pwd.user = user
|
32
|
+
pwd.password = pwd.password_confirmation = '_'
|
33
|
+
pwd.key = user.password_salt + '|' + user.password_hash
|
34
|
+
pwd.save!
|
35
|
+
end
|
36
|
+
end
|
37
|
+
class FacebookToken < ActiveRecord::Base
|
38
|
+
belongs_to :user
|
39
|
+
end
|
40
|
+
FacebookToken.all.each do |token|
|
41
|
+
cred = Credentials::Facebook.new
|
42
|
+
cred.user = token.user
|
43
|
+
cred.facebook_uid = token.external_uid
|
44
|
+
cred.key = token.access_token
|
45
|
+
cred.save!
|
29
46
|
end
|
30
47
|
|
31
48
|
# Update the columns in the User model.
|
@@ -57,5 +74,9 @@ class FinishUpgradingUserModel < ActiveRecord::Migration
|
|
57
74
|
end
|
58
75
|
end
|
59
76
|
FinishUpgradingUserModel.migrate :up
|
77
|
+
class DropFacebookTokens < ActiveRecord::Migration
|
78
|
+
def change
|
79
|
+
drop_table :facebook_tokens
|
80
|
+
end
|
81
|
+
end
|
60
82
|
reload!
|
61
|
-
|
data/lib/authpwn_rails.rb
CHANGED
@@ -11,6 +11,7 @@ module Authpwn
|
|
11
11
|
# Contains extensions to the User model.
|
12
12
|
module UserExtensions
|
13
13
|
autoload :EmailField, 'authpwn_rails/user_extensions/email_field.rb'
|
14
|
+
autoload :FacebookFields, 'authpwn_rails/user_extensions/facebook_fields.rb'
|
14
15
|
autoload :PasswordField, 'authpwn_rails/user_extensions/password_field.rb'
|
15
16
|
end
|
16
17
|
end
|
@@ -6,6 +6,9 @@ class User < ActiveRecord::Base
|
|
6
6
|
# include Authpwn::UserExtensions::EmailField
|
7
7
|
# Virtual password attribute, with confirmation validation.
|
8
8
|
# include Authpwn::UserExtensions::PasswordField
|
9
|
+
# Convenience Facebook accessors.
|
10
|
+
# include Authpwn::UserExtensions::FacebookFields
|
11
|
+
|
9
12
|
|
10
13
|
# Add your extensions to the User class here.
|
11
14
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_support'
|
3
|
+
|
4
|
+
# :nodoc: namespace
|
5
|
+
module Authpwn
|
6
|
+
|
7
|
+
# :nodoc: namespace
|
8
|
+
module UserExtensions
|
9
|
+
|
10
|
+
# Augments the User model with Facebook-related virtual attributes.
|
11
|
+
module FacebookFields
|
12
|
+
extend ActiveSupport::Concern
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
# The user that owns a given Facebook OAuth2 token.
|
16
|
+
#
|
17
|
+
# A new user will be created if the token doesn't belong to any user. This
|
18
|
+
# is the case for a new visitor.
|
19
|
+
def for_facebook_token(access_token)
|
20
|
+
Credentials::Facebook.for(access_token).user
|
21
|
+
end
|
22
|
+
|
23
|
+
# The user who has a certain e-mail, or nil if the e-mail is unclaimed.
|
24
|
+
def with_facebook_uid(facebook_uid)
|
25
|
+
credential = Credentials::Facebook.where(:name => facebook_uid).
|
26
|
+
includes(:user).first
|
27
|
+
credential && credential.user
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module InstanceMethods
|
32
|
+
# Credentials::Facebook instance associated with this user.
|
33
|
+
def facebook_credential
|
34
|
+
credentials.find { |c| c.instance_of?(Credentials::Facebook) }
|
35
|
+
end
|
36
|
+
|
37
|
+
# FBGraph client loaded with this access token.
|
38
|
+
#
|
39
|
+
# Returns nil if this user has no Facebook credential.
|
40
|
+
def facebook_client
|
41
|
+
credential = self.facebook_credential
|
42
|
+
credential && credential.facebook_client
|
43
|
+
end
|
44
|
+
|
45
|
+
# The facebook user ID from the user's Facebook credential.
|
46
|
+
#
|
47
|
+
# Returns nil if this user has no Facebook credential.
|
48
|
+
def facebook_uid
|
49
|
+
credential = self.facebook_credential
|
50
|
+
credential && credential.facebook_uid
|
51
|
+
end
|
52
|
+
|
53
|
+
# The facebook OAuth2 access token from the user's Facebook credential.
|
54
|
+
#
|
55
|
+
# Returns nil if this user has no Facebook credential.
|
56
|
+
def facebook_access_token
|
57
|
+
credential = self.facebook_credential
|
58
|
+
credential && credential.access_token
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end # module Authpwn::UserExtensions::FacebookFields
|
62
|
+
|
63
|
+
end # module Authpwn::UserExtensions
|
64
|
+
|
65
|
+
end # module Authpwn
|
@@ -52,26 +52,6 @@ module UserModel
|
|
52
52
|
self.exuid ||= (Time.now.to_f * 1_000_000).to_i
|
53
53
|
end
|
54
54
|
end # module Authpwn::UserModel::InstanceMethods
|
55
|
-
|
56
55
|
end # namespace Authpwn::UserModel
|
57
56
|
|
58
57
|
end # namespace Authpwn
|
59
|
-
|
60
|
-
|
61
|
-
# :nodoc: adds Facebook integration methods to the User model.
|
62
|
-
module Authpwn::UserModel::ClassMethods
|
63
|
-
# The user that owns a given Facebook OAuth2 token.
|
64
|
-
#
|
65
|
-
# A new user will be created if the token doesn't belong to any user. This
|
66
|
-
# is the case for a new visitor.
|
67
|
-
def for_facebook_token(access_token)
|
68
|
-
Credentials::Facebook.for(access_token).user
|
69
|
-
end
|
70
|
-
end # module Authpwn::UserModel::ClassMethods
|
71
|
-
|
72
|
-
# :nodoc: adds Facebook integration methods to the User model.
|
73
|
-
module Authpwn::UserModel::InstanceMethods
|
74
|
-
def facebook_credential
|
75
|
-
credentials.find { |c| c.instance_of?(Credentials::Facebook) }
|
76
|
-
end
|
77
|
-
end # module Authpwn::UserModel::InstanceMethods
|
data/test/email_field_test.rb
CHANGED
@@ -15,11 +15,22 @@ class FacebookController < ApplicationController
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
class UserWithFb2 < User
|
19
|
+
include Authpwn::UserExtensions::FacebookFields
|
20
|
+
end
|
21
|
+
|
18
22
|
class FacebookControllerTest < ActionController::TestCase
|
19
23
|
setup do
|
24
|
+
@old_user_class = ::User
|
25
|
+
::User = UserWithFb2
|
26
|
+
|
20
27
|
@user = users(:john)
|
21
28
|
@new_token = 'facebook:new_token|boom'
|
22
29
|
end
|
30
|
+
|
31
|
+
teardown do
|
32
|
+
::User = @old_user_class
|
33
|
+
end
|
23
34
|
|
24
35
|
test "no facebook token" do
|
25
36
|
get :show
|
@@ -57,19 +57,8 @@ class FacebookCredentialTest < ActiveSupport::TestCase
|
|
57
57
|
assert_equal '123456789', credential.facebook_uid
|
58
58
|
assert_equal @credential.key, credential.key
|
59
59
|
assert !credential.new_record?, 'New credential not saved'
|
60
|
-
assert !credential.user.new_record?, "New credential's user not saved"
|
60
|
+
assert !credential.user.new_record?, "New credential's user not saved"
|
61
|
+
assert_operator credential.user.credentials, :include?, credential,
|
62
|
+
"New user's credentials does not include Facebook credential"
|
61
63
|
end
|
62
|
-
|
63
|
-
test 'User#facebook_credential' do
|
64
|
-
user = users(:john)
|
65
|
-
assert_equal credentials(:john_facebook), user.facebook_credential
|
66
|
-
end
|
67
|
-
|
68
|
-
test 'User#for_facebook_token' do
|
69
|
-
flexmock(Credentials::Facebook).should_receive(:uid_from_token).
|
70
|
-
with(credentials(:john_facebook).key).
|
71
|
-
and_return(credentials(:john_facebook).facebook_uid)
|
72
|
-
assert_equal users(:john),
|
73
|
-
User.for_facebook_token(credentials(:john_facebook).key)
|
74
|
-
end
|
75
64
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class UserWithFb < User
|
4
|
+
include Authpwn::UserExtensions::FacebookFields
|
5
|
+
end
|
6
|
+
|
7
|
+
class FacebookFieldsTest < ActiveSupport::TestCase
|
8
|
+
def setup
|
9
|
+
@user = UserWithFb.new
|
10
|
+
|
11
|
+
@john = UserWithFb.find_by_id(users(:john).id)
|
12
|
+
@jane = UserWithFb.find_by_id(users(:jane).id)
|
13
|
+
@bill = UserWithFb.find_by_id(users(:bill).id)
|
14
|
+
end
|
15
|
+
|
16
|
+
test 'setup' do
|
17
|
+
assert @user.valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
test 'facebook_credential' do
|
21
|
+
assert_equal credentials(:john_facebook), @john.facebook_credential
|
22
|
+
assert_equal credentials(:jane_facebook), @jane.facebook_credential
|
23
|
+
assert_nil @bill.facebook_credential
|
24
|
+
end
|
25
|
+
|
26
|
+
test 'facebook_uid' do
|
27
|
+
assert_equal credentials(:john_facebook).facebook_uid, @john.facebook_uid
|
28
|
+
assert_equal credentials(:jane_facebook).facebook_uid, @jane.facebook_uid
|
29
|
+
assert_nil @bill.facebook_uid
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'facebook_access_token' do
|
33
|
+
assert_equal credentials(:john_facebook).access_token,
|
34
|
+
@john.facebook_access_token
|
35
|
+
assert_equal credentials(:jane_facebook).access_token,
|
36
|
+
@jane.facebook_access_token
|
37
|
+
assert_nil @bill.facebook_access_token
|
38
|
+
end
|
39
|
+
|
40
|
+
test 'facebook_client' do
|
41
|
+
assert_equal credentials(:john_facebook).access_token,
|
42
|
+
@john.facebook_client.access_token
|
43
|
+
assert_nil @bill.facebook_client
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'with_facebook_uid' do
|
47
|
+
assert_equal users(:john), UserWithFb.with_facebook_uid(
|
48
|
+
credentials(:john_facebook).facebook_uid)
|
49
|
+
assert_equal users(:jane), UserWithFb.with_facebook_uid(
|
50
|
+
credentials(:jane_facebook).facebook_uid)
|
51
|
+
assert_nil UserWithFb.with_facebook_uid('0000000')
|
52
|
+
end
|
53
|
+
|
54
|
+
test 'for_facebook_token' do
|
55
|
+
flexmock(Credentials::Facebook).should_receive(:uid_from_token).
|
56
|
+
with(credentials(:john_facebook).key).
|
57
|
+
and_return(credentials(:john_facebook).facebook_uid)
|
58
|
+
assert_equal users(:john),
|
59
|
+
UserWithFb.for_facebook_token(credentials(:john_facebook).access_token)
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: authpwn_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-11-25 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fbgraph_rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &24789920 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.2.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *24789920
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rails
|
27
|
-
requirement: &
|
27
|
+
requirement: &24770680 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 3.1.3
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *24770680
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &24769460 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.0.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *24769460
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: flexmock
|
49
|
-
requirement: &
|
49
|
+
requirement: &24767220 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.9.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *24767220
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: jeweler
|
60
|
-
requirement: &
|
60
|
+
requirement: &24766540 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.6.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *24766540
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rcov
|
71
|
-
requirement: &
|
71
|
+
requirement: &24765740 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *24765740
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: sqlite3
|
82
|
-
requirement: &
|
82
|
+
requirement: &24765080 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: 1.3.3
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *24765080
|
91
91
|
description: Works with Facebook.
|
92
92
|
email: victor@costan.us
|
93
93
|
executables: []
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- lib/authpwn_rails/session_controller.rb
|
133
133
|
- lib/authpwn_rails/test_extensions.rb
|
134
134
|
- lib/authpwn_rails/user_extensions/email_field.rb
|
135
|
+
- lib/authpwn_rails/user_extensions/facebook_fields.rb
|
135
136
|
- lib/authpwn_rails/user_extensions/password_field.rb
|
136
137
|
- lib/authpwn_rails/user_model.rb
|
137
138
|
- test/cookie_controller_test.rb
|
@@ -139,6 +140,7 @@ files:
|
|
139
140
|
- test/email_field_test.rb
|
140
141
|
- test/facebook_controller_test.rb
|
141
142
|
- test/facebook_credential_test.rb
|
143
|
+
- test/facebook_fields_test.rb
|
142
144
|
- test/helpers/application_controller.rb
|
143
145
|
- test/helpers/autoload_path.rb
|
144
146
|
- test/helpers/db_setup.rb
|
@@ -165,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
167
|
version: '0'
|
166
168
|
segments:
|
167
169
|
- 0
|
168
|
-
hash: -
|
170
|
+
hash: -300984823103934206
|
169
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
172
|
none: false
|
171
173
|
requirements:
|