sorcery 0.2.1 → 0.4.0
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/Gemfile +3 -2
- data/Gemfile.lock +13 -11
- data/README.rdoc +157 -61
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/lib/generators/sorcery_migration/sorcery_migration_generator.rb +24 -0
- data/lib/generators/sorcery_migration/templates/activity_logging.rb +17 -0
- data/lib/generators/sorcery_migration/templates/brute_force_protection.rb +11 -0
- data/lib/generators/sorcery_migration/templates/core.rb +16 -0
- data/lib/generators/sorcery_migration/templates/external.rb +14 -0
- data/lib/generators/sorcery_migration/templates/remember_me.rb +15 -0
- data/lib/generators/sorcery_migration/templates/reset_password.rb +13 -0
- data/lib/generators/sorcery_migration/templates/user_activation.rb +17 -0
- data/lib/sorcery/controller/adapters/sinatra.rb +97 -0
- data/lib/sorcery/controller/submodules/external/protocols/oauth1.rb +35 -0
- data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +26 -0
- data/lib/sorcery/controller/submodules/{oauth → external}/providers/facebook.rb +24 -6
- data/lib/sorcery/controller/submodules/{oauth → external}/providers/twitter.rb +31 -6
- data/lib/sorcery/controller/submodules/{oauth.rb → external.rb} +18 -27
- data/lib/sorcery/controller/submodules/http_basic_auth.rb +11 -7
- data/lib/sorcery/controller.rb +21 -21
- data/lib/sorcery/crypto_providers/bcrypt.rb +1 -1
- data/lib/sorcery/crypto_providers/common.rb +35 -0
- data/lib/sorcery/crypto_providers/md5.rb +3 -23
- data/lib/sorcery/crypto_providers/sha1.rb +4 -16
- data/lib/sorcery/crypto_providers/sha256.rb +3 -23
- data/lib/sorcery/crypto_providers/sha512.rb +3 -23
- data/lib/sorcery/engine.rb +4 -0
- data/lib/sorcery/initializers/initializer.rb +86 -0
- data/lib/sorcery/model/submodules/activity_logging.rb +1 -1
- data/lib/sorcery/model/submodules/brute_force_protection.rb +0 -4
- data/lib/sorcery/model/submodules/{oauth.rb → external.rb} +3 -3
- data/lib/sorcery/model.rb +13 -8
- data/lib/sorcery/railties/tasks.rake +10 -0
- data/lib/sorcery/sinatra.rb +5 -0
- data/lib/sorcery/test_helpers/rails.rb +54 -0
- data/lib/sorcery/test_helpers/sinatra.rb +128 -0
- data/lib/sorcery/test_helpers.rb +20 -52
- data/lib/sorcery.rb +18 -7
- data/sorcery.gemspec +204 -137
- data/spec/Gemfile +2 -2
- data/spec/Gemfile.lock +10 -10
- data/spec/Rakefile +1 -0
- data/spec/rails3/.rspec +1 -1
- data/spec/rails3/{app_root/Gemfile → Gemfile} +5 -7
- data/spec/rails3/{app_root/Gemfile.lock → Gemfile.lock} +20 -23
- data/spec/rails3/{app_root/Rakefile → Rakefile} +1 -0
- data/spec/rails3/{app_root/app → app}/controllers/application_controller.rb +11 -11
- data/spec/rails3/config/database.yml +27 -0
- data/spec/rails3/{app_root/spec → spec}/controller_brute_force_protection_spec.rb +3 -2
- data/spec/rails3/{app_root/spec → spec}/controller_oauth2_spec.rb +25 -22
- data/spec/rails3/{app_root/spec → spec}/controller_oauth_spec.rb +23 -18
- data/spec/rails3/{app_root/spec → spec}/controller_session_timeout_spec.rb +10 -6
- data/spec/rails3/spec/spec.opts +2 -0
- data/spec/rails3/spec/spec_helper.rb +70 -0
- data/spec/rails3/{app_root/spec → spec}/user_activation_spec.rb +5 -1
- data/spec/rails3/{app_root/spec → spec}/user_oauth_spec.rb +7 -7
- data/spec/rails3/{app_root/spec → spec}/user_reset_password_spec.rb +7 -3
- data/spec/rails3/{app_root/spec → spec}/user_spec.rb +5 -11
- data/spec/sinatra/Gemfile +12 -0
- data/spec/sinatra/Gemfile.lock +134 -0
- data/spec/sinatra/Rakefile +11 -0
- data/spec/sinatra/authentication.rb +3 -0
- data/spec/sinatra/db/migrate/activation/20101224223622_add_activation_to_users.rb +17 -0
- data/spec/sinatra/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +17 -0
- data/spec/sinatra/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +11 -0
- data/spec/sinatra/db/migrate/core/20101224223620_create_users.rb +16 -0
- data/spec/sinatra/db/migrate/external/20101224223628_create_authentications.rb +14 -0
- data/spec/sinatra/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +15 -0
- data/spec/sinatra/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +13 -0
- data/spec/sinatra/filters.rb +21 -0
- data/spec/sinatra/myapp.rb +133 -0
- data/spec/sinatra/sorcery_mailer.rb +25 -0
- data/spec/sinatra/spec/controller_activity_logging_spec.rb +85 -0
- data/spec/sinatra/spec/controller_brute_force_protection_spec.rb +70 -0
- data/spec/sinatra/spec/controller_http_basic_auth_spec.rb +53 -0
- data/spec/sinatra/spec/controller_oauth2_spec.rb +120 -0
- data/spec/sinatra/spec/controller_oauth_spec.rb +121 -0
- data/spec/sinatra/spec/controller_remember_me_spec.rb +64 -0
- data/spec/sinatra/spec/controller_session_timeout_spec.rb +56 -0
- data/spec/sinatra/spec/controller_spec.rb +120 -0
- data/spec/sinatra/spec/spec.opts +2 -0
- data/spec/sinatra/spec/spec_helper.rb +45 -0
- data/spec/sinatra/user.rb +6 -0
- data/spec/sinatra/views/test_login.erb +4 -0
- data/spec/sorcery_crypto_providers_spec.rb +5 -4
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +3 -4
- data/spec/untitled folder +18 -0
- metadata +214 -139
- data/lib/sorcery/controller/submodules/oauth/oauth1.rb +0 -26
- data/lib/sorcery/controller/submodules/oauth/oauth2.rb +0 -24
- data/spec/rails3/app_root/.rspec +0 -1
- data/spec/rails3/app_root/config/database.yml +0 -27
- data/spec/rails3/app_root/spec/spec_helper.rb +0 -61
- /data/spec/rails3/{app_root/.gitignore → .gitignore} +0 -0
- /data/spec/rails3/{app_root/README → README} +0 -0
- /data/spec/rails3/{app_root/Rakefile.unused → Rakefile.unused} +0 -0
- /data/spec/rails3/{app_root/app → app}/helpers/application_helper.rb +0 -0
- /data/spec/rails3/{app_root/app → app}/mailers/sorcery_mailer.rb +0 -0
- /data/spec/rails3/{app_root/app → app}/models/authentication.rb +0 -0
- /data/spec/rails3/{app_root/app → app}/models/user.rb +0 -0
- /data/spec/rails3/{app_root/app → app}/views/layouts/application.html.erb +0 -0
- /data/spec/rails3/{app_root/app → app}/views/sorcery_mailer/activation_email.html.erb +0 -0
- /data/spec/rails3/{app_root/app → app}/views/sorcery_mailer/activation_email.text.erb +0 -0
- /data/spec/rails3/{app_root/app → app}/views/sorcery_mailer/activation_success_email.html.erb +0 -0
- /data/spec/rails3/{app_root/app → app}/views/sorcery_mailer/activation_success_email.text.erb +0 -0
- /data/spec/rails3/{app_root/app → app}/views/sorcery_mailer/reset_password_email.html.erb +0 -0
- /data/spec/rails3/{app_root/app → app}/views/sorcery_mailer/reset_password_email.text.erb +0 -0
- /data/spec/rails3/{app_root/config → config}/application.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/boot.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/environment.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/environments/development.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/environments/in_memory.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/environments/production.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/environments/test.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/initializers/backtrace_silencers.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/initializers/inflections.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/initializers/mime_types.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/initializers/secret_token.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/initializers/session_store.rb +0 -0
- /data/spec/rails3/{app_root/config → config}/locales/en.yml +0 -0
- /data/spec/rails3/{app_root/config → config}/routes.rb +0 -0
- /data/spec/rails3/{app_root/config.ru → config.ru} +0 -0
- /data/spec/rails3/{app_root/db → db}/migrate/activation/20101224223622_add_activation_to_users.rb +0 -0
- /data/spec/rails3/{app_root/db → db}/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -0
- /data/spec/rails3/{app_root/db → db}/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -0
- /data/spec/rails3/{app_root/db → db}/migrate/core/20101224223620_create_users.rb +0 -0
- /data/spec/rails3/{app_root/db/migrate/oauth → db/migrate/external}/20101224223628_create_authentications.rb +0 -0
- /data/spec/rails3/{app_root/db → db}/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -0
- /data/spec/rails3/{app_root/db → db}/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -0
- /data/spec/rails3/{app_root/db → db}/schema.rb +0 -0
- /data/spec/rails3/{app_root/db → db}/seeds.rb +0 -0
- /data/spec/rails3/{app_root/lib → lib}/tasks/.gitkeep +0 -0
- /data/spec/rails3/{app_root/public → public}/404.html +0 -0
- /data/spec/rails3/{app_root/public → public}/422.html +0 -0
- /data/spec/rails3/{app_root/public → public}/500.html +0 -0
- /data/spec/rails3/{app_root/public → public}/favicon.ico +0 -0
- /data/spec/rails3/{app_root/public → public}/images/rails.png +0 -0
- /data/spec/rails3/{app_root/public → public}/index.html +0 -0
- /data/spec/rails3/{app_root/public → public}/javascripts/application.js +0 -0
- /data/spec/rails3/{app_root/public → public}/javascripts/controls.js +0 -0
- /data/spec/rails3/{app_root/public → public}/javascripts/dragdrop.js +0 -0
- /data/spec/rails3/{app_root/public → public}/javascripts/effects.js +0 -0
- /data/spec/rails3/{app_root/public → public}/javascripts/prototype.js +0 -0
- /data/spec/rails3/{app_root/public → public}/javascripts/rails.js +0 -0
- /data/spec/rails3/{app_root/public → public}/robots.txt +0 -0
- /data/spec/rails3/{app_root/public → public}/stylesheets/.gitkeep +0 -0
- /data/spec/rails3/{app_root/script → script}/rails +0 -0
- /data/spec/rails3/{app_root/spec → spec}/controller_activity_logging_spec.rb +0 -0
- /data/spec/rails3/{app_root/spec → spec}/controller_http_basic_auth_spec.rb +0 -0
- /data/spec/rails3/{app_root/spec → spec}/controller_remember_me_spec.rb +0 -0
- /data/spec/rails3/{app_root/spec → spec}/controller_spec.rb +0 -0
- /data/spec/rails3/{app_root/spec → spec}/spec_helper.orig.rb +0 -0
- /data/spec/rails3/{app_root/spec → spec}/user_activity_logging_spec.rb +0 -0
- /data/spec/rails3/{app_root/spec → spec}/user_brute_force_protection_spec.rb +0 -0
- /data/spec/rails3/{app_root/spec → spec}/user_remember_me_spec.rb +0 -0
- /data/spec/rails3/{app_root/vendor → vendor}/plugins/.gitkeep +0 -0
|
@@ -22,7 +22,7 @@ class ApplicationController < ActionController::Base
|
|
|
22
22
|
|
|
23
23
|
def test_return_to
|
|
24
24
|
@user = login(params[:username], params[:password])
|
|
25
|
-
|
|
25
|
+
redirect_back_or_to(:index, :notice => 'haha!')
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def test_logout
|
|
@@ -66,24 +66,24 @@ class ApplicationController < ActionController::Base
|
|
|
66
66
|
render :text => "HTTP Basic Auth"
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
def
|
|
70
|
-
|
|
69
|
+
def login_at_test
|
|
70
|
+
login_at(:twitter)
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
def
|
|
74
|
-
|
|
73
|
+
def login_at_test2
|
|
74
|
+
login_at(:facebook)
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
def
|
|
78
|
-
if @user =
|
|
77
|
+
def test_login_from
|
|
78
|
+
if @user = login_from(:twitter)
|
|
79
79
|
redirect_to "bla", :notice => "Success!"
|
|
80
80
|
else
|
|
81
81
|
redirect_to "blu", :alert => "Failed!"
|
|
82
82
|
end
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
-
def
|
|
86
|
-
if @user =
|
|
85
|
+
def test_login_from2
|
|
86
|
+
if @user = login_from(:facebook)
|
|
87
87
|
redirect_to "bla", :notice => "Success!"
|
|
88
88
|
else
|
|
89
89
|
redirect_to "blu", :alert => "Failed!"
|
|
@@ -92,8 +92,8 @@ class ApplicationController < ActionController::Base
|
|
|
92
92
|
|
|
93
93
|
def test_create_from_provider
|
|
94
94
|
provider = params[:provider]
|
|
95
|
-
|
|
96
|
-
if @user =
|
|
95
|
+
login_from(provider)
|
|
96
|
+
if @user = create_from(provider)
|
|
97
97
|
redirect_to "bla", :notice => "Success!"
|
|
98
98
|
else
|
|
99
99
|
redirect_to "blu", :alert => "Failed!"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# SQLite version 3.x
|
|
2
|
+
# gem install sqlite3-ruby (not necessary on OS X Leopard)
|
|
3
|
+
# development:
|
|
4
|
+
# adapter: sqlite3
|
|
5
|
+
# database: db/development.sqlite3
|
|
6
|
+
# pool: 5
|
|
7
|
+
# timeout: 5000
|
|
8
|
+
#
|
|
9
|
+
# # Warning: The database defined as "test" will be erased and
|
|
10
|
+
# # re-generated from your development database when you run "rake".
|
|
11
|
+
# # Do not set this db to the same as development or production.
|
|
12
|
+
# test:
|
|
13
|
+
# adapter: sqlite3
|
|
14
|
+
# database: db/test.sqlite3
|
|
15
|
+
# pool: 5
|
|
16
|
+
# timeout: 5000
|
|
17
|
+
#
|
|
18
|
+
# production:
|
|
19
|
+
# adapter: sqlite3
|
|
20
|
+
# database: db/production.sqlite3
|
|
21
|
+
# pool: 5
|
|
22
|
+
# timeout: 5000
|
|
23
|
+
|
|
24
|
+
in_memory:
|
|
25
|
+
adapter: sqlite3
|
|
26
|
+
database: ":memory:"
|
|
27
|
+
verbosity: quiet
|
|
@@ -19,6 +19,7 @@ describe ApplicationController do
|
|
|
19
19
|
after(:each) do
|
|
20
20
|
Sorcery::Controller::Config.reset!
|
|
21
21
|
sorcery_controller_property_set(:user_class, User)
|
|
22
|
+
Timecop.return
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
it "should count login retries" do
|
|
@@ -46,7 +47,7 @@ describe ApplicationController do
|
|
|
46
47
|
get :test_login, :username => 'gizmo', :password => 'blabla'
|
|
47
48
|
get :test_login, :username => 'gizmo', :password => 'blabla'
|
|
48
49
|
User.find_by_username('gizmo').lock_expires_at.should_not be_nil
|
|
49
|
-
|
|
50
|
+
Timecop.travel(Time.now + 0.3)
|
|
50
51
|
get :test_login, :username => 'gizmo', :password => 'blabla'
|
|
51
52
|
User.find_by_username('gizmo').lock_expires_at.should be_nil
|
|
52
53
|
end
|
|
@@ -57,7 +58,7 @@ describe ApplicationController do
|
|
|
57
58
|
get :test_login, :username => 'gizmo', :password => 'blabla'
|
|
58
59
|
get :test_login, :username => 'gizmo', :password => 'blabla'
|
|
59
60
|
unlock_date = User.find_by_username('gizmo').lock_expires_at
|
|
60
|
-
|
|
61
|
+
Timecop.travel(Time.now + 1)
|
|
61
62
|
get :test_login, :username => 'gizmo', :password => 'blabla'
|
|
62
63
|
User.find_by_username('gizmo').lock_expires_at.to_s.should == unlock_date.to_s
|
|
63
64
|
end
|
|
@@ -12,16 +12,16 @@ end
|
|
|
12
12
|
|
|
13
13
|
describe ApplicationController do
|
|
14
14
|
before(:all) do
|
|
15
|
-
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/
|
|
16
|
-
sorcery_reload!([:
|
|
17
|
-
sorcery_controller_property_set(:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
16
|
+
sorcery_reload!([:external])
|
|
17
|
+
sorcery_controller_property_set(:external_providers, [:facebook])
|
|
18
|
+
sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
|
|
19
|
+
sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
20
|
+
sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
after(:all) do
|
|
24
|
-
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/
|
|
24
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
25
25
|
end
|
|
26
26
|
# ----------------- OAuth -----------------------
|
|
27
27
|
describe ApplicationController, "with OAuth features" do
|
|
@@ -32,39 +32,42 @@ describe ApplicationController do
|
|
|
32
32
|
|
|
33
33
|
after(:each) do
|
|
34
34
|
User.delete_all
|
|
35
|
+
Authentication.delete_all
|
|
35
36
|
end
|
|
36
37
|
|
|
37
|
-
it "
|
|
38
|
+
it "login_at redirects correctly" do
|
|
38
39
|
create_new_user
|
|
39
|
-
get :
|
|
40
|
+
get :login_at_test2
|
|
40
41
|
response.should be_a_redirect
|
|
41
|
-
response.should redirect_to("http://myapi.com/oauth/authorize?client_id=key&redirect_uri=http%3A%2F%2Fblabla.com&scope=email%2Coffline_access&type=web_server")
|
|
42
|
+
#response.should redirect_to("http://myapi.com/oauth/authorize?client_id=key&redirect_uri=http%3A%2F%2Fblabla.com&scope=email%2Coffline_access&type=web_server")
|
|
43
|
+
response.should redirect_to("http://myapi.com/oauth/authorize?client_id=key&redirect_uri=http%3A%2F%2Fblabla.com&scope=email%2Coffline_access&response_type=code")
|
|
42
44
|
end
|
|
43
45
|
|
|
44
|
-
it "'
|
|
46
|
+
it "'login_from' logins if user exists" do
|
|
45
47
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
46
48
|
create_new_external_user(:facebook)
|
|
47
|
-
get :
|
|
49
|
+
get :test_login_from2
|
|
48
50
|
flash[:notice].should == "Success!"
|
|
49
51
|
end
|
|
50
52
|
|
|
51
|
-
it "'
|
|
53
|
+
it "'login_from' fails if user doesn't exist" do
|
|
52
54
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
53
55
|
create_new_user
|
|
54
|
-
get :
|
|
56
|
+
get :test_login_from2
|
|
55
57
|
flash[:alert].should == "Failed!"
|
|
56
58
|
end
|
|
57
59
|
end
|
|
58
60
|
|
|
59
|
-
describe ApplicationController, "'
|
|
61
|
+
describe ApplicationController, "'create_from'" do
|
|
60
62
|
before(:each) do
|
|
61
63
|
stub_all_oauth2_requests!
|
|
62
64
|
User.delete_all
|
|
65
|
+
Authentication.delete_all
|
|
63
66
|
end
|
|
64
67
|
|
|
65
68
|
it "should create a new user" do
|
|
66
69
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
67
|
-
|
|
70
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, {:username => "name"})
|
|
68
71
|
lambda do
|
|
69
72
|
get :test_create_from_provider, :provider => "facebook"
|
|
70
73
|
end.should change(User, :count).by(1)
|
|
@@ -73,7 +76,7 @@ describe ApplicationController do
|
|
|
73
76
|
|
|
74
77
|
it "should support nested attributes" do
|
|
75
78
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
76
|
-
|
|
79
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, {:username => "hometown/name"})
|
|
77
80
|
lambda do
|
|
78
81
|
get :test_create_from_provider, :provider => "facebook"
|
|
79
82
|
end.should change(User, :count).by(1)
|
|
@@ -84,11 +87,11 @@ describe ApplicationController do
|
|
|
84
87
|
describe ApplicationController, "OAuth with User Activation features" do
|
|
85
88
|
before(:all) do
|
|
86
89
|
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
|
|
87
|
-
sorcery_reload!([:user_activation,:
|
|
88
|
-
sorcery_controller_property_set(:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer)
|
|
91
|
+
sorcery_controller_property_set(:external_providers, [:facebook])
|
|
92
|
+
sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
|
|
93
|
+
sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
94
|
+
sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
|
|
92
95
|
end
|
|
93
96
|
|
|
94
97
|
after(:all) do
|
|
@@ -9,7 +9,9 @@ def stub_all_oauth_requests!
|
|
|
9
9
|
@consumer.stub!(:get_request_token).and_return(@req_token)
|
|
10
10
|
@acc_token = OAuth::AccessToken.new(@consumer)
|
|
11
11
|
@req_token.stub!(:get_access_token).and_return(@acc_token)
|
|
12
|
-
session[:request_token] = @req_token
|
|
12
|
+
session[:request_token] = @req_token.token
|
|
13
|
+
session[:request_token_secret] = @req_token.secret
|
|
14
|
+
OAuth::RequestToken.stub!(:new).and_return(@req_token)
|
|
13
15
|
response = OpenStruct.new()
|
|
14
16
|
response.body = {"following"=>false, "listed_count"=>0, "profile_link_color"=>"0084B4", "profile_image_url"=>"http://a1.twimg.com/profile_images/536178575/noamb_normal.jpg", "description"=>"Programmer/Heavy Metal Fan/New Father", "status"=>{"text"=>"coming soon to sorcery gem: twitter and facebook authentication support.", "truncated"=>false, "favorited"=>false, "source"=>"web", "geo"=>nil, "in_reply_to_screen_name"=>nil, "in_reply_to_user_id"=>nil, "in_reply_to_status_id_str"=>nil, "created_at"=>"Sun Mar 06 23:01:12 +0000 2011", "contributors"=>nil, "place"=>nil, "retweeted"=>false, "in_reply_to_status_id"=>nil, "in_reply_to_user_id_str"=>nil, "coordinates"=>nil, "retweet_count"=>0, "id"=>44533012284706816, "id_str"=>"44533012284706816"}, "show_all_inline_media"=>false, "geo_enabled"=>true, "profile_sidebar_border_color"=>"a8c7f7", "url"=>nil, "followers_count"=>10, "screen_name"=>"nbenari", "profile_use_background_image"=>true, "location"=>"Israel", "statuses_count"=>25, "profile_background_color"=>"022330", "lang"=>"en", "verified"=>false, "notifications"=>false, "profile_background_image_url"=>"http://a3.twimg.com/profile_background_images/104087198/04042010339.jpg", "favourites_count"=>5, "created_at"=>"Fri Nov 20 21:58:19 +0000 2009", "is_translator"=>false, "contributors_enabled"=>false, "protected"=>false, "follow_request_sent"=>false, "time_zone"=>"Greenland", "profile_text_color"=>"333333", "name"=>"Noam Ben Ari", "friends_count"=>10, "profile_sidebar_fill_color"=>"C0DFEC", "id"=>123, "id_str"=>"91434812", "profile_background_tile"=>false, "utc_offset"=>-10800}.to_json
|
|
15
17
|
@acc_token.stub!(:get).and_return(response)
|
|
@@ -17,19 +19,19 @@ end
|
|
|
17
19
|
|
|
18
20
|
describe ApplicationController do
|
|
19
21
|
before(:all) do
|
|
20
|
-
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/
|
|
21
|
-
sorcery_reload!([:
|
|
22
|
-
sorcery_controller_property_set(:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
23
|
+
sorcery_reload!([:external])
|
|
24
|
+
sorcery_controller_property_set(:external_providers, [:twitter])
|
|
25
|
+
sorcery_controller_external_property_set(:twitter, :key, "eYVNBjBDi33aa9GkA3w")
|
|
26
|
+
sorcery_controller_external_property_set(:twitter, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
27
|
+
sorcery_controller_external_property_set(:twitter, :callback_url, "http://blabla.com")
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
after(:all) do
|
|
29
|
-
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/
|
|
31
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
30
32
|
end
|
|
31
33
|
# ----------------- OAuth -----------------------
|
|
32
|
-
describe ApplicationController, "'
|
|
34
|
+
describe ApplicationController, "'login_from'" do
|
|
33
35
|
|
|
34
36
|
before(:each) do
|
|
35
37
|
stub_all_oauth_requests!
|
|
@@ -37,11 +39,12 @@ describe ApplicationController do
|
|
|
37
39
|
|
|
38
40
|
after(:each) do
|
|
39
41
|
User.delete_all
|
|
42
|
+
Authentication.delete_all
|
|
40
43
|
end
|
|
41
44
|
|
|
42
|
-
it "
|
|
45
|
+
it "login_at redirects correctly" do
|
|
43
46
|
create_new_user
|
|
44
|
-
get :
|
|
47
|
+
get :login_at_test
|
|
45
48
|
response.should be_a_redirect
|
|
46
49
|
response.should redirect_to("http://myapi.com/oauth/authorize?oauth_callback=http%3A%2F%2Fblabla.com&oauth_token=")
|
|
47
50
|
end
|
|
@@ -49,27 +52,28 @@ describe ApplicationController do
|
|
|
49
52
|
it "logins if user exists" do
|
|
50
53
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
51
54
|
create_new_external_user(:twitter)
|
|
52
|
-
get :
|
|
55
|
+
get :test_login_from, :oauth_verifier => "blablaRERASDFcxvSDFA"
|
|
53
56
|
flash[:notice].should == "Success!"
|
|
54
57
|
end
|
|
55
58
|
|
|
56
|
-
it "'
|
|
59
|
+
it "'login_from' fails if user doesn't exist" do
|
|
57
60
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
58
61
|
create_new_user
|
|
59
|
-
get :
|
|
62
|
+
get :test_login_from, :oauth_verifier => "blablaRERASDFcxvSDFA"
|
|
60
63
|
flash[:alert].should == "Failed!"
|
|
61
64
|
end
|
|
62
65
|
end
|
|
63
66
|
|
|
64
|
-
describe ApplicationController, "'
|
|
67
|
+
describe ApplicationController, "'create_from'" do
|
|
65
68
|
before(:each) do
|
|
66
69
|
stub_all_oauth_requests!
|
|
67
70
|
User.delete_all
|
|
71
|
+
Authentication.delete_all
|
|
68
72
|
end
|
|
69
73
|
|
|
70
74
|
it "should create a new user" do
|
|
71
75
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
72
|
-
|
|
76
|
+
sorcery_controller_external_property_set(:twitter, :user_info_mapping, {:username => "screen_name"})
|
|
73
77
|
lambda do
|
|
74
78
|
get :test_create_from_provider, :provider => "twitter"
|
|
75
79
|
end.should change(User, :count).by(1)
|
|
@@ -78,7 +82,7 @@ describe ApplicationController do
|
|
|
78
82
|
|
|
79
83
|
it "should support nested attributes" do
|
|
80
84
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
81
|
-
|
|
85
|
+
sorcery_controller_external_property_set(:twitter, :user_info_mapping, {:username => "status/text"})
|
|
82
86
|
lambda do
|
|
83
87
|
get :test_create_from_provider, :provider => "twitter"
|
|
84
88
|
end.should change(User, :count).by(1)
|
|
@@ -89,7 +93,7 @@ describe ApplicationController do
|
|
|
89
93
|
describe ApplicationController, "OAuth with User Activation features" do
|
|
90
94
|
before(:all) do
|
|
91
95
|
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
|
|
92
|
-
sorcery_reload!([:user_activation,:
|
|
96
|
+
sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer)
|
|
93
97
|
end
|
|
94
98
|
|
|
95
99
|
after(:all) do
|
|
@@ -98,6 +102,7 @@ describe ApplicationController do
|
|
|
98
102
|
|
|
99
103
|
after(:each) do
|
|
100
104
|
User.delete_all
|
|
105
|
+
Authentication.delete_all
|
|
101
106
|
end
|
|
102
107
|
|
|
103
108
|
it "should not send activation email to external users" do
|
|
@@ -10,6 +10,10 @@ describe ApplicationController do
|
|
|
10
10
|
create_new_user
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
after(:each) do
|
|
14
|
+
Timecop.return
|
|
15
|
+
end
|
|
16
|
+
|
|
13
17
|
it "should not reset session before session timeout" do
|
|
14
18
|
login_user
|
|
15
19
|
get :test_should_be_logged_in
|
|
@@ -19,7 +23,7 @@ describe ApplicationController do
|
|
|
19
23
|
|
|
20
24
|
it "should reset session after session timeout" do
|
|
21
25
|
login_user
|
|
22
|
-
|
|
26
|
+
Timecop.travel(Time.now+0.6)
|
|
23
27
|
get :test_should_be_logged_in
|
|
24
28
|
session[:user_id].should be_nil
|
|
25
29
|
response.should be_a_redirect
|
|
@@ -27,11 +31,11 @@ describe ApplicationController do
|
|
|
27
31
|
|
|
28
32
|
it "with 'session_timeout_from_last_action' should not logout if there was activity" do
|
|
29
33
|
sorcery_controller_property_set(:session_timeout_from_last_action, true)
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
get :test_login, :username => 'gizmo', :password => 'secret'
|
|
35
|
+
Timecop.travel(Time.now+0.3)
|
|
32
36
|
get :test_should_be_logged_in
|
|
33
37
|
session[:user_id].should_not be_nil
|
|
34
|
-
|
|
38
|
+
Timecop.travel(Time.now+0.3)
|
|
35
39
|
get :test_should_be_logged_in
|
|
36
40
|
session[:user_id].should_not be_nil
|
|
37
41
|
response.should be_a_success
|
|
@@ -39,8 +43,8 @@ describe ApplicationController do
|
|
|
39
43
|
|
|
40
44
|
it "with 'session_timeout_from_last_action' should logout if there was no activity" do
|
|
41
45
|
sorcery_controller_property_set(:session_timeout_from_last_action, true)
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
get :test_login, :username => 'gizmo', :password => 'secret'
|
|
47
|
+
Timecop.travel(Time.now+0.6)
|
|
44
48
|
get :test_should_be_logged_in
|
|
45
49
|
session[:user_id].should be_nil
|
|
46
50
|
response.should be_a_redirect
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
$: << File.join(File.dirname(__FILE__), '..', '..', 'lib' )
|
|
2
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
|
3
|
+
# Set the default environment to sqlite3's in_memory database
|
|
4
|
+
ENV['RAILS_ENV'] ||= 'in_memory'
|
|
5
|
+
require File.expand_path("../../config/environment", __FILE__)
|
|
6
|
+
require 'rspec/rails'
|
|
7
|
+
require 'timecop'
|
|
8
|
+
# require 'simplecov'
|
|
9
|
+
# SimpleCov.root File.join(File.dirname(__FILE__), "..", "..", "rails3" )
|
|
10
|
+
# SimpleCov.start do
|
|
11
|
+
# add_filter "/config/"
|
|
12
|
+
#
|
|
13
|
+
# add_group 'Controllers', 'app/controllers'
|
|
14
|
+
# add_group 'Models', 'app/models'
|
|
15
|
+
# add_group 'Helpers', 'app/helpers'
|
|
16
|
+
# add_group 'Libraries', 'lib'
|
|
17
|
+
# add_group 'Plugins', 'vendor/plugins'
|
|
18
|
+
# add_group 'Migrations', 'db/migrate'
|
|
19
|
+
# end
|
|
20
|
+
|
|
21
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
|
22
|
+
# in spec/support/ and its subdirectories.
|
|
23
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
RSpec.configure do |config|
|
|
28
|
+
config.include RSpec::Rails::ControllerExampleGroup, :example_group => { :file_path => /controller(.)*_spec.rb$/ }
|
|
29
|
+
# == Mock Framework
|
|
30
|
+
#
|
|
31
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
|
32
|
+
#
|
|
33
|
+
# config.mock_with :mocha
|
|
34
|
+
# config.mock_with :flexmock
|
|
35
|
+
# config.mock_with :rr
|
|
36
|
+
config.mock_with :rspec
|
|
37
|
+
|
|
38
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
|
39
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
|
40
|
+
|
|
41
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
|
42
|
+
# examples within a transaction, remove the following line or assign false
|
|
43
|
+
# instead of true.
|
|
44
|
+
config.use_transactional_fixtures = true
|
|
45
|
+
|
|
46
|
+
config.before(:suite) do
|
|
47
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/core")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
config.after(:suite) do
|
|
51
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/core")
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
#----------------------------------------------------------------
|
|
56
|
+
# needed when running individual specs
|
|
57
|
+
require File.join(File.dirname(__FILE__), '..','app','models','user')
|
|
58
|
+
require File.join(File.dirname(__FILE__), '..','app','models','authentication')
|
|
59
|
+
|
|
60
|
+
class TestUser < ActiveRecord::Base
|
|
61
|
+
authenticates_with_sorcery!
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
class TestMailer < ActionMailer::Base
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
include ::Sorcery::TestHelpers
|
|
69
|
+
include ::Sorcery::TestHelpers::Rails
|
|
70
|
+
|
|
@@ -150,6 +150,10 @@ describe "User with activation submodule" do
|
|
|
150
150
|
sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
|
|
151
151
|
end
|
|
152
152
|
|
|
153
|
+
after(:each) do
|
|
154
|
+
Timecop.return
|
|
155
|
+
end
|
|
156
|
+
|
|
153
157
|
it "load_from_activation_token should return user when token is found" do
|
|
154
158
|
create_new_user
|
|
155
159
|
User.load_from_activation_token(@user.activation_token).should == @user
|
|
@@ -169,7 +173,7 @@ describe "User with activation submodule" do
|
|
|
169
173
|
it "load_from_activation_token should NOT return user when token is found and expired" do
|
|
170
174
|
sorcery_model_property_set(:activation_token_expiration_period, 0.1)
|
|
171
175
|
create_new_user
|
|
172
|
-
|
|
176
|
+
Timecop.travel(Time.now+0.5)
|
|
173
177
|
User.load_from_activation_token(@user.activation_token).should == nil
|
|
174
178
|
end
|
|
175
179
|
|
|
@@ -2,23 +2,23 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
|
2
2
|
|
|
3
3
|
describe "User with oauth submodule" do
|
|
4
4
|
before(:all) do
|
|
5
|
-
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/
|
|
5
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
after(:all) do
|
|
9
|
-
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/
|
|
9
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
# ----------------- PLUGIN CONFIGURATION -----------------------
|
|
13
13
|
describe User, "loaded plugin configuration" do
|
|
14
14
|
|
|
15
15
|
before(:all) do
|
|
16
|
-
sorcery_reload!([:
|
|
17
|
-
sorcery_controller_property_set(:
|
|
16
|
+
sorcery_reload!([:external])
|
|
17
|
+
sorcery_controller_property_set(:external_providers, [:twitter])
|
|
18
18
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
sorcery_controller_external_property_set(:twitter, :key, "eYVNBjBDi33aa9GkA3w")
|
|
20
|
+
sorcery_controller_external_property_set(:twitter, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
21
|
+
sorcery_controller_external_property_set(:twitter, :callback_url, "http://blabla.com")
|
|
22
22
|
create_new_external_user(:twitter)
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -76,7 +76,11 @@ describe "User with reset_password submodule" do
|
|
|
76
76
|
before(:each) do
|
|
77
77
|
User.delete_all
|
|
78
78
|
end
|
|
79
|
-
|
|
79
|
+
|
|
80
|
+
after(:each) do
|
|
81
|
+
Timecop.return
|
|
82
|
+
end
|
|
83
|
+
|
|
80
84
|
it "load_from_reset_password_token should return user when token is found" do
|
|
81
85
|
create_new_user
|
|
82
86
|
@user.deliver_reset_password_instructions!
|
|
@@ -100,7 +104,7 @@ describe "User with reset_password submodule" do
|
|
|
100
104
|
create_new_user
|
|
101
105
|
sorcery_model_property_set(:reset_password_expiration_period, 0.1)
|
|
102
106
|
@user.deliver_reset_password_instructions!
|
|
103
|
-
|
|
107
|
+
Timecop.travel(Time.now+0.5)
|
|
104
108
|
User.load_from_reset_password_token(@user.reset_password_token).should == nil
|
|
105
109
|
end
|
|
106
110
|
|
|
@@ -164,7 +168,7 @@ describe "User with reset_password submodule" do
|
|
|
164
168
|
old_size = ActionMailer::Base.deliveries.size
|
|
165
169
|
@user.deliver_reset_password_instructions!
|
|
166
170
|
ActionMailer::Base.deliveries.size.should == old_size + 1
|
|
167
|
-
|
|
171
|
+
Timecop.travel(Time.now+0.5)
|
|
168
172
|
@user.deliver_reset_password_instructions!
|
|
169
173
|
ActionMailer::Base.deliveries.size.should == old_size + 2
|
|
170
174
|
end
|
|
@@ -8,14 +8,8 @@ describe "User with no submodules (core)" do
|
|
|
8
8
|
|
|
9
9
|
describe User, "when app has plugin loaded" do
|
|
10
10
|
it "should respond to the plugin activation class method" do
|
|
11
|
-
ActiveRecord::Base.should respond_to(:
|
|
12
|
-
User.should respond_to(:
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it "plugin activation should yield config to block" do
|
|
16
|
-
User.activate_sorcery! do |config|
|
|
17
|
-
config.class.should == ::Sorcery::Model::Config
|
|
18
|
-
end
|
|
11
|
+
ActiveRecord::Base.should respond_to(:authenticates_with_sorcery!)
|
|
12
|
+
User.should respond_to(:authenticates_with_sorcery!)
|
|
19
13
|
end
|
|
20
14
|
end
|
|
21
15
|
|
|
@@ -23,7 +17,7 @@ describe "User with no submodules (core)" do
|
|
|
23
17
|
describe TestUser, "Testing activated class self-registration" do
|
|
24
18
|
it "should register itself as user_class if activated" do
|
|
25
19
|
TestUser.class_eval do
|
|
26
|
-
|
|
20
|
+
authenticates_with_sorcery!
|
|
27
21
|
end
|
|
28
22
|
::Sorcery::Controller::Config.user_class.should == TestUser
|
|
29
23
|
end
|
|
@@ -286,12 +280,12 @@ describe "User with no submodules (core)" do
|
|
|
286
280
|
|
|
287
281
|
describe User, "external users" do
|
|
288
282
|
before(:all) do
|
|
289
|
-
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/
|
|
283
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
290
284
|
sorcery_reload!()
|
|
291
285
|
end
|
|
292
286
|
|
|
293
287
|
after(:all) do
|
|
294
|
-
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/
|
|
288
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
295
289
|
end
|
|
296
290
|
|
|
297
291
|
before(:each) do
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
source 'http://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gem 'sinatra', '>= 1.2.0'
|
|
4
|
+
gem 'sqlite3-ruby', :require => 'sqlite3'
|
|
5
|
+
gem "sorcery", '0.4.0', :path => '../../'
|
|
6
|
+
|
|
7
|
+
group :development, :test do
|
|
8
|
+
gem "rspec", "~> 2.5.0"
|
|
9
|
+
gem 'ruby-debug19'
|
|
10
|
+
gem 'simplecov', '>= 0.3.8', :require => false # Will install simplecov-html as a dependency
|
|
11
|
+
gem 'timecop'
|
|
12
|
+
end
|