sorcery 0.3.1 → 0.4.2
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 +89 -61
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/lib/generators/sorcery_migration/templates/core.rb +2 -2
- data/lib/sorcery/controller/submodules/http_basic_auth.rb +1 -1
- data/lib/sorcery/controller.rb +16 -18
- data/lib/sorcery/crypto_providers/bcrypt.rb +3 -5
- 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 +1 -1
- data/lib/sorcery/model/submodules/reset_password.rb +1 -1
- data/lib/sorcery/model.rb +25 -3
- data/lib/sorcery/railties/tasks.rake +10 -0
- data/lib/sorcery/sinatra.rb +0 -9
- data/lib/sorcery/test_helpers/internal/rails.rb +52 -0
- data/lib/sorcery/test_helpers/internal/sinatra.rb +122 -0
- data/lib/sorcery/test_helpers/internal.rb +55 -0
- data/lib/sorcery/test_helpers/rails.rb +5 -46
- data/lib/sorcery/test_helpers/sinatra.rb +58 -104
- data/lib/sorcery/test_helpers.rb +0 -35
- data/lib/sorcery.rb +8 -0
- data/sorcery.gemspec +140 -146
- data/spec/Gemfile +2 -2
- data/spec/Gemfile.lock +20 -12
- data/spec/Rakefile +1 -0
- data/spec/rails3/.rspec +1 -1
- data/spec/rails3/{app_root/Gemfile → Gemfile} +4 -4
- data/spec/rails3/{app_root/Gemfile.lock → Gemfile.lock} +20 -20
- data/spec/rails3/{app_root/Rakefile → Rakefile} +1 -0
- data/spec/rails3/config/database.yml +27 -0
- data/spec/rails3/{app_root/spec → spec}/controller_activity_logging_spec.rb +2 -4
- 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 +10 -9
- data/spec/rails3/{app_root/spec → spec}/controller_oauth_spec.rb +8 -8
- data/spec/rails3/spec/controller_session_timeout_spec.rb +55 -0
- data/spec/rails3/{app_root/spec → spec}/controller_spec.rb +6 -16
- 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 +7 -13
- data/spec/rails3/{app_root/spec → spec}/user_brute_force_protection_spec.rb +2 -30
- data/spec/rails3/{app_root/spec → spec}/user_oauth_spec.rb +3 -3
- data/spec/rails3/{app_root/spec → spec}/user_remember_me_spec.rb +3 -11
- data/spec/rails3/{app_root/spec → spec}/user_reset_password_spec.rb +20 -17
- data/spec/rails3/{app_root/spec → spec}/user_spec.rb +19 -9
- data/spec/sinatra/Gemfile +3 -3
- data/spec/sinatra/Gemfile.lock +17 -17
- data/spec/sinatra/Rakefile +1 -0
- data/spec/sinatra/spec/controller_brute_force_protection_spec.rb +3 -2
- data/spec/sinatra/spec/controller_oauth2_spec.rb +10 -9
- data/spec/sinatra/spec/controller_oauth_spec.rb +5 -5
- data/spec/sinatra/spec/controller_session_timeout_spec.rb +28 -23
- data/spec/sinatra/spec/spec.opts +2 -4
- data/spec/sinatra/spec/spec_helper.rb +4 -2
- data/spec/sorcery_crypto_providers_spec.rb +5 -4
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +3 -4
- metadata +151 -149
- data/lib/sorcery/controller/submodules/email.rb +0 -44
- data/lib/sorcery/controller/submodules/oauth.rb +0 -95
- data/spec/rails3/app_root/.rspec +0 -1
- data/spec/rails3/app_root/config/database.yml +0 -27
- data/spec/rails3/app_root/spec/controller_session_timeout_spec.rb +0 -50
- data/spec/rails3/app_root/spec/spec_helper.rb +0 -62
- data/spec/sinatra/spec/user_activation_spec.rb +0 -188
- data/spec/sinatra/spec/user_activity_logging_spec.rb +0 -36
- data/spec/sinatra/spec/user_brute_force_protection_spec.rb +0 -76
- data/spec/sinatra/spec/user_oauth_spec.rb +0 -39
- data/spec/sinatra/spec/user_remember_me_spec.rb +0 -66
- data/spec/sinatra/spec/user_reset_password_spec.rb +0 -178
- data/spec/sinatra/spec/user_spec.rb +0 -317
- /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}/controllers/application_controller.rb +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 → 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_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}/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/vendor → vendor}/plugins/.gitkeep +0 -0
|
@@ -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
|
|
@@ -22,10 +22,8 @@ describe ApplicationController do
|
|
|
22
22
|
after(:each) do
|
|
23
23
|
User.delete_all
|
|
24
24
|
end
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
subject.should respond_to(:current_users)
|
|
28
|
-
end
|
|
25
|
+
|
|
26
|
+
specify { subject.should respond_to(:current_users) }
|
|
29
27
|
|
|
30
28
|
it "'current_users' should be empty when no users are logged in" do
|
|
31
29
|
subject.current_users.size.should == 0
|
|
@@ -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
|
|
@@ -15,9 +15,9 @@ describe ApplicationController do
|
|
|
15
15
|
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
16
16
|
sorcery_reload!([:external])
|
|
17
17
|
sorcery_controller_property_set(:external_providers, [:facebook])
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
@@ -39,7 +39,8 @@ describe ApplicationController do
|
|
|
39
39
|
create_new_user
|
|
40
40
|
get :login_at_test2
|
|
41
41
|
response.should be_a_redirect
|
|
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")
|
|
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")
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
it "'login_from' logins if user exists" do
|
|
@@ -66,7 +67,7 @@ describe ApplicationController do
|
|
|
66
67
|
|
|
67
68
|
it "should create a new user" do
|
|
68
69
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
69
|
-
|
|
70
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, {:username => "name"})
|
|
70
71
|
lambda do
|
|
71
72
|
get :test_create_from_provider, :provider => "facebook"
|
|
72
73
|
end.should change(User, :count).by(1)
|
|
@@ -75,7 +76,7 @@ describe ApplicationController do
|
|
|
75
76
|
|
|
76
77
|
it "should support nested attributes" do
|
|
77
78
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
78
|
-
|
|
79
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, {:username => "hometown/name"})
|
|
79
80
|
lambda do
|
|
80
81
|
get :test_create_from_provider, :provider => "facebook"
|
|
81
82
|
end.should change(User, :count).by(1)
|
|
@@ -88,9 +89,9 @@ describe ApplicationController do
|
|
|
88
89
|
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
|
|
89
90
|
sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer)
|
|
90
91
|
sorcery_controller_property_set(:external_providers, [:facebook])
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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")
|
|
94
95
|
end
|
|
95
96
|
|
|
96
97
|
after(:all) do
|
|
@@ -22,16 +22,16 @@ describe ApplicationController do
|
|
|
22
22
|
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
23
23
|
sorcery_reload!([:external])
|
|
24
24
|
sorcery_controller_property_set(:external_providers, [:twitter])
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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")
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
after(:all) do
|
|
31
31
|
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
32
32
|
end
|
|
33
33
|
# ----------------- OAuth -----------------------
|
|
34
|
-
describe ApplicationController, "'
|
|
34
|
+
describe ApplicationController, "'using external API to login'" do
|
|
35
35
|
|
|
36
36
|
before(:each) do
|
|
37
37
|
stub_all_oauth_requests!
|
|
@@ -64,7 +64,7 @@ describe ApplicationController do
|
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
describe ApplicationController, "'create_from'" do
|
|
67
|
+
describe ApplicationController, "using 'create_from'" do
|
|
68
68
|
before(:each) do
|
|
69
69
|
stub_all_oauth_requests!
|
|
70
70
|
User.delete_all
|
|
@@ -73,7 +73,7 @@ describe ApplicationController do
|
|
|
73
73
|
|
|
74
74
|
it "should create a new user" do
|
|
75
75
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
76
|
-
|
|
76
|
+
sorcery_controller_external_property_set(:twitter, :user_info_mapping, {:username => "screen_name"})
|
|
77
77
|
lambda do
|
|
78
78
|
get :test_create_from_provider, :provider => "twitter"
|
|
79
79
|
end.should change(User, :count).by(1)
|
|
@@ -82,7 +82,7 @@ describe ApplicationController do
|
|
|
82
82
|
|
|
83
83
|
it "should support nested attributes" do
|
|
84
84
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
85
|
-
|
|
85
|
+
sorcery_controller_external_property_set(:twitter, :user_info_mapping, {:username => "status/text"})
|
|
86
86
|
lambda do
|
|
87
87
|
get :test_create_from_provider, :provider => "twitter"
|
|
88
88
|
end.should change(User, :count).by(1)
|
|
@@ -90,7 +90,7 @@ describe ApplicationController do
|
|
|
90
90
|
end
|
|
91
91
|
end
|
|
92
92
|
|
|
93
|
-
describe ApplicationController, "OAuth with User Activation features" do
|
|
93
|
+
describe ApplicationController, "using OAuth with User Activation features" do
|
|
94
94
|
before(:all) do
|
|
95
95
|
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
|
|
96
96
|
sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
|
+
|
|
3
|
+
describe ApplicationController do
|
|
4
|
+
|
|
5
|
+
# ----------------- SESSION TIMEOUT -----------------------
|
|
6
|
+
describe ApplicationController, "with session timeout features" do
|
|
7
|
+
before(:all) do
|
|
8
|
+
sorcery_reload!([:session_timeout])
|
|
9
|
+
sorcery_controller_property_set(:session_timeout,0.5)
|
|
10
|
+
create_new_user
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
after(:each) do
|
|
14
|
+
Timecop.return
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should not reset session before session timeout" do
|
|
18
|
+
login_user
|
|
19
|
+
get :test_should_be_logged_in
|
|
20
|
+
session[:user_id].should_not be_nil
|
|
21
|
+
response.should be_a_success
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should reset session after session timeout" do
|
|
25
|
+
login_user
|
|
26
|
+
Timecop.travel(Time.now+0.6)
|
|
27
|
+
get :test_should_be_logged_in
|
|
28
|
+
session[:user_id].should be_nil
|
|
29
|
+
response.should be_a_redirect
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "with 'session_timeout_from_last_action'" do
|
|
33
|
+
it "should not logout if there was activity" do
|
|
34
|
+
sorcery_controller_property_set(:session_timeout_from_last_action, true)
|
|
35
|
+
get :test_login, :username => 'gizmo', :password => 'secret'
|
|
36
|
+
Timecop.travel(Time.now+0.3)
|
|
37
|
+
get :test_should_be_logged_in
|
|
38
|
+
session[:user_id].should_not be_nil
|
|
39
|
+
Timecop.travel(Time.now+0.3)
|
|
40
|
+
get :test_should_be_logged_in
|
|
41
|
+
session[:user_id].should_not be_nil
|
|
42
|
+
response.should be_a_success
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "with 'session_timeout_from_last_action' should logout if there was no activity" do
|
|
46
|
+
sorcery_controller_property_set(:session_timeout_from_last_action, true)
|
|
47
|
+
get :test_login, :username => 'gizmo', :password => 'secret'
|
|
48
|
+
Timecop.travel(Time.now+0.6)
|
|
49
|
+
get :test_should_be_logged_in
|
|
50
|
+
session[:user_id].should be_nil
|
|
51
|
+
response.should be_a_redirect
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -37,21 +37,13 @@ describe ApplicationController do
|
|
|
37
37
|
sorcery_controller_property_set(:user_class, User)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
it "should respond to the instance method logout" do
|
|
45
|
-
should respond_to(:logout)
|
|
46
|
-
end
|
|
40
|
+
specify { should respond_to(:login) }
|
|
41
|
+
|
|
42
|
+
specify { should respond_to(:logout) }
|
|
47
43
|
|
|
48
|
-
|
|
49
|
-
should respond_to(:logged_in?)
|
|
50
|
-
end
|
|
44
|
+
specify { should respond_to(:logged_in?) }
|
|
51
45
|
|
|
52
|
-
|
|
53
|
-
should respond_to(:current_user)
|
|
54
|
-
end
|
|
46
|
+
specify { should respond_to(:current_user) }
|
|
55
47
|
|
|
56
48
|
it "login(username,password) should return the user when success and set the session with user.id" do
|
|
57
49
|
get :test_login, :username => 'gizmo', :password => 'secret'
|
|
@@ -93,9 +85,7 @@ describe ApplicationController do
|
|
|
93
85
|
subject.current_user.should == false
|
|
94
86
|
end
|
|
95
87
|
|
|
96
|
-
|
|
97
|
-
should respond_to(:require_login)
|
|
98
|
-
end
|
|
88
|
+
specify { should respond_to(:require_login) }
|
|
99
89
|
|
|
100
90
|
it "should call the configured 'not_authenticated_action' when authenticate before_filter fails" do
|
|
101
91
|
session[:user_id] = nil
|
|
@@ -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::Internal
|
|
69
|
+
include ::Sorcery::TestHelpers::Internal::Rails
|
|
70
|
+
|
|
@@ -57,23 +57,17 @@ describe "User with activation submodule" do
|
|
|
57
57
|
sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
before(:each) do
|
|
61
61
|
create_new_user
|
|
62
|
-
@user.activation_token.should_not be_nil
|
|
63
62
|
end
|
|
64
63
|
|
|
65
64
|
it "should initialize user state to 'pending'" do
|
|
66
|
-
create_new_user
|
|
67
65
|
@user.activation_state.should == "pending"
|
|
68
66
|
end
|
|
69
67
|
|
|
70
|
-
|
|
71
|
-
create_new_user
|
|
72
|
-
@user.should respond_to(:activate!)
|
|
73
|
-
end
|
|
68
|
+
specify { @user.should respond_to(:activate!) }
|
|
74
69
|
|
|
75
70
|
it "should clear activation code and change state to 'active' on activation" do
|
|
76
|
-
create_new_user
|
|
77
71
|
activation_token = @user.activation_token
|
|
78
72
|
@user.activate!
|
|
79
73
|
@user2 = User.find(@user.id) # go to db to make sure it was saved and not just in memory
|
|
@@ -89,7 +83,6 @@ describe "User with activation submodule" do
|
|
|
89
83
|
end
|
|
90
84
|
|
|
91
85
|
it "subsequent saves do not send activation email" do
|
|
92
|
-
create_new_user
|
|
93
86
|
old_size = ActionMailer::Base.deliveries.size
|
|
94
87
|
@user.username = "Shauli"
|
|
95
88
|
@user.save!
|
|
@@ -97,14 +90,12 @@ describe "User with activation submodule" do
|
|
|
97
90
|
end
|
|
98
91
|
|
|
99
92
|
it "should send the user an activation success email on successful activation" do
|
|
100
|
-
create_new_user
|
|
101
93
|
old_size = ActionMailer::Base.deliveries.size
|
|
102
94
|
@user.activate!
|
|
103
95
|
ActionMailer::Base.deliveries.size.should == old_size + 1
|
|
104
96
|
end
|
|
105
97
|
|
|
106
98
|
it "subsequent saves do not send activation success email" do
|
|
107
|
-
create_new_user
|
|
108
99
|
@user.activate!
|
|
109
100
|
old_size = ActionMailer::Base.deliveries.size
|
|
110
101
|
@user.username = "Shauli"
|
|
@@ -121,7 +112,6 @@ describe "User with activation submodule" do
|
|
|
121
112
|
|
|
122
113
|
it "activation success email is optional" do
|
|
123
114
|
sorcery_model_property_set(:activation_success_email_method_name, nil)
|
|
124
|
-
create_new_user
|
|
125
115
|
old_size = ActionMailer::Base.deliveries.size
|
|
126
116
|
@user.activate!
|
|
127
117
|
ActionMailer::Base.deliveries.size.should == old_size
|
|
@@ -150,6 +140,10 @@ describe "User with activation submodule" do
|
|
|
150
140
|
sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
|
|
151
141
|
end
|
|
152
142
|
|
|
143
|
+
after(:each) do
|
|
144
|
+
Timecop.return
|
|
145
|
+
end
|
|
146
|
+
|
|
153
147
|
it "load_from_activation_token should return user when token is found" do
|
|
154
148
|
create_new_user
|
|
155
149
|
User.load_from_activation_token(@user.activation_token).should == @user
|
|
@@ -169,7 +163,7 @@ describe "User with activation submodule" do
|
|
|
169
163
|
it "load_from_activation_token should NOT return user when token is found and expired" do
|
|
170
164
|
sorcery_model_property_set(:activation_token_expiration_period, 0.1)
|
|
171
165
|
create_new_user
|
|
172
|
-
|
|
166
|
+
Timecop.travel(Time.now+0.5)
|
|
173
167
|
User.load_from_activation_token(@user.activation_token).should == nil
|
|
174
168
|
end
|
|
175
169
|
|
|
@@ -21,13 +21,8 @@ describe "User with brute_force_protection submodule" do
|
|
|
21
21
|
User.sorcery_config.reset!
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it "should respond to 'lock_expires_at'" do
|
|
29
|
-
@user.should respond_to(:failed_logins_count)
|
|
30
|
-
end
|
|
24
|
+
specify { @user.should respond_to(:failed_logins_count) }
|
|
25
|
+
specify { @user.should respond_to(:lock_expires_at) }
|
|
31
26
|
|
|
32
27
|
it "should enable configuration option 'failed_logins_count_attribute_name'" do
|
|
33
28
|
sorcery_model_property_set(:failed_logins_count_attribute_name, :my_count)
|
|
@@ -49,28 +44,5 @@ describe "User with brute_force_protection submodule" do
|
|
|
49
44
|
User.sorcery_config.login_lock_time_period.should == 2.hours
|
|
50
45
|
end
|
|
51
46
|
end
|
|
52
|
-
|
|
53
|
-
# ----------------- PLUGIN ACTIVATED -----------------------
|
|
54
|
-
describe User, "when activated with sorcery" do
|
|
55
|
-
|
|
56
|
-
before(:all) do
|
|
57
|
-
sorcery_reload!([:brute_force_protection])
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
before(:each) do
|
|
61
|
-
User.delete_all
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# it "should increment failed_logins_count on a failed login" do
|
|
65
|
-
# create_new_user
|
|
66
|
-
#
|
|
67
|
-
# end
|
|
68
|
-
#
|
|
69
|
-
# it "should set lock expiry (effectively lock user) when failed_logins_count reaches max within max period" do
|
|
70
|
-
# create_new_user
|
|
71
|
-
# @user.lock_expires_at.should == Time.now.utc + 30
|
|
72
|
-
# end
|
|
73
|
-
|
|
74
|
-
end
|
|
75
47
|
|
|
76
48
|
end
|
|
@@ -16,9 +16,9 @@ describe "User with oauth submodule" do
|
|
|
16
16
|
sorcery_reload!([:external])
|
|
17
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
|
|
|
@@ -13,6 +13,7 @@ describe "User with remember_me submodule" do
|
|
|
13
13
|
describe User, "loaded plugin configuration" do
|
|
14
14
|
before(:all) do
|
|
15
15
|
sorcery_reload!([:remember_me])
|
|
16
|
+
create_new_user
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
after(:each) do
|
|
@@ -29,32 +30,23 @@ describe "User with remember_me submodule" do
|
|
|
29
30
|
User.sorcery_config.remember_me_token_expires_at_attribute_name.should equal(:my_expires)
|
|
30
31
|
end
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
create_new_user
|
|
34
|
-
@user.should respond_to(:remember_me!)
|
|
35
|
-
end
|
|
33
|
+
specify { @user.should respond_to(:remember_me!) }
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
create_new_user
|
|
39
|
-
@user.should respond_to(:forget_me!)
|
|
40
|
-
end
|
|
35
|
+
specify { @user.should respond_to(:forget_me!) }
|
|
41
36
|
|
|
42
37
|
it "should generate a new token on 'remember_me!'" do
|
|
43
|
-
create_new_user
|
|
44
38
|
@user.remember_me_token.should be_nil
|
|
45
39
|
@user.remember_me!
|
|
46
40
|
@user.remember_me_token.should_not be_nil
|
|
47
41
|
end
|
|
48
42
|
|
|
49
43
|
it "should set an expiration based on 'remember_me_for' attribute" do
|
|
50
|
-
create_new_user
|
|
51
44
|
sorcery_model_property_set(:remember_me_for, 2 * 60 * 60 * 24)
|
|
52
45
|
@user.remember_me!
|
|
53
46
|
@user.remember_me_token_expires_at.to_s.should == (Time.now + 2 * 60 * 60 * 24).utc.to_s
|
|
54
47
|
end
|
|
55
48
|
|
|
56
49
|
it "should delete the token and expiration on 'forget_me!'" do
|
|
57
|
-
create_new_user
|
|
58
50
|
@user.remember_me!
|
|
59
51
|
@user.remember_me_token.should_not be_nil
|
|
60
52
|
@user.forget_me!
|
|
@@ -20,21 +20,20 @@ describe "User with reset_password submodule" do
|
|
|
20
20
|
User.sorcery_config.reset!
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@user.should respond_to(:reset_password!)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
User.should respond_to(:load_from_reset_password_token)
|
|
23
|
+
context "API" do
|
|
24
|
+
before(:all) do
|
|
25
|
+
create_new_user
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
specify { @user.should respond_to(:deliver_reset_password_instructions!) }
|
|
29
|
+
|
|
30
|
+
specify { @user.should respond_to(:reset_password!) }
|
|
31
|
+
|
|
32
|
+
it "should respond to .load_from_reset_password_token" do
|
|
33
|
+
User.should respond_to(:load_from_reset_password_token)
|
|
34
|
+
end
|
|
36
35
|
end
|
|
37
|
-
|
|
36
|
+
|
|
38
37
|
it "should allow configuration option 'reset_password_token_attribute_name'" do
|
|
39
38
|
sorcery_model_property_set(:reset_password_token_attribute_name, :my_code)
|
|
40
39
|
User.sorcery_config.reset_password_token_attribute_name.should equal(:my_code)
|
|
@@ -76,7 +75,11 @@ describe "User with reset_password submodule" do
|
|
|
76
75
|
before(:each) do
|
|
77
76
|
User.delete_all
|
|
78
77
|
end
|
|
79
|
-
|
|
78
|
+
|
|
79
|
+
after(:each) do
|
|
80
|
+
Timecop.return
|
|
81
|
+
end
|
|
82
|
+
|
|
80
83
|
it "load_from_reset_password_token should return user when token is found" do
|
|
81
84
|
create_new_user
|
|
82
85
|
@user.deliver_reset_password_instructions!
|
|
@@ -100,7 +103,7 @@ describe "User with reset_password submodule" do
|
|
|
100
103
|
create_new_user
|
|
101
104
|
sorcery_model_property_set(:reset_password_expiration_period, 0.1)
|
|
102
105
|
@user.deliver_reset_password_instructions!
|
|
103
|
-
|
|
106
|
+
Timecop.travel(Time.now+0.5)
|
|
104
107
|
User.load_from_reset_password_token(@user.reset_password_token).should == nil
|
|
105
108
|
end
|
|
106
109
|
|
|
@@ -164,7 +167,7 @@ describe "User with reset_password submodule" do
|
|
|
164
167
|
old_size = ActionMailer::Base.deliveries.size
|
|
165
168
|
@user.deliver_reset_password_instructions!
|
|
166
169
|
ActionMailer::Base.deliveries.size.should == old_size + 1
|
|
167
|
-
|
|
170
|
+
Timecop.travel(Time.now+0.5)
|
|
168
171
|
@user.deliver_reset_password_instructions!
|
|
169
172
|
ActionMailer::Base.deliveries.size.should == old_size + 2
|
|
170
173
|
end
|
|
@@ -8,14 +8,11 @@ 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(:activate_sorcery!)
|
|
11
|
+
ActiveRecord::Base.should respond_to(:authenticates_with_sorcery!)
|
|
13
12
|
end
|
|
14
13
|
|
|
15
|
-
it "
|
|
16
|
-
User.
|
|
17
|
-
config.class.should == ::Sorcery::Model::Config
|
|
18
|
-
end
|
|
14
|
+
it "User should respond_to .authenticates_with_sorcery!" do
|
|
15
|
+
User.should respond_to(:authenticates_with_sorcery!)
|
|
19
16
|
end
|
|
20
17
|
end
|
|
21
18
|
|
|
@@ -23,7 +20,7 @@ describe "User with no submodules (core)" do
|
|
|
23
20
|
describe TestUser, "Testing activated class self-registration" do
|
|
24
21
|
it "should register itself as user_class if activated" do
|
|
25
22
|
TestUser.class_eval do
|
|
26
|
-
|
|
23
|
+
authenticates_with_sorcery!
|
|
27
24
|
end
|
|
28
25
|
::Sorcery::Controller::Config.user_class.should == TestUser
|
|
29
26
|
end
|
|
@@ -115,8 +112,21 @@ describe "User with no submodules (core)" do
|
|
|
115
112
|
User.authenticate(@user.send(User.sorcery_config.username_attribute_name), 'wrong!').should be_false
|
|
116
113
|
end
|
|
117
114
|
|
|
118
|
-
|
|
119
|
-
|
|
115
|
+
specify { User.should respond_to(:encrypt) }
|
|
116
|
+
|
|
117
|
+
it "subclass should inherit config if defined so" do
|
|
118
|
+
sorcery_reload!([],{:subclasses_inherit_config => true})
|
|
119
|
+
class Admin < User
|
|
120
|
+
end
|
|
121
|
+
Admin.sorcery_config.should_not be_nil
|
|
122
|
+
Admin.sorcery_config.should == User.sorcery_config
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "subclass should not inherit config if not defined so" do
|
|
126
|
+
sorcery_reload!([],{:subclasses_inherit_config => false})
|
|
127
|
+
class Admin2 < User
|
|
128
|
+
end
|
|
129
|
+
Admin2.sorcery_config.should be_nil
|
|
120
130
|
end
|
|
121
131
|
end
|
|
122
132
|
|
data/spec/sinatra/Gemfile
CHANGED
|
@@ -2,11 +2,11 @@ source 'http://rubygems.org'
|
|
|
2
2
|
|
|
3
3
|
gem 'sinatra', '>= 1.2.0'
|
|
4
4
|
gem 'sqlite3-ruby', :require => 'sqlite3'
|
|
5
|
-
gem "sorcery", '0.
|
|
5
|
+
gem "sorcery", '>= 0.1.0', :path => '../../'
|
|
6
6
|
|
|
7
7
|
group :development, :test do
|
|
8
|
-
gem
|
|
8
|
+
gem "rspec", "~> 2.5.0"
|
|
9
9
|
gem 'ruby-debug19'
|
|
10
10
|
gem 'simplecov', '>= 0.3.8', :require => false # Will install simplecov-html as a dependency
|
|
11
|
-
gem '
|
|
11
|
+
gem 'timecop'
|
|
12
12
|
end
|