cb-sorcery 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/.document +5 -0
  2. data/.gitignore +56 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +40 -0
  5. data/CHANGELOG.md +263 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE.txt +20 -0
  8. data/README.md +360 -0
  9. data/Rakefile +6 -0
  10. data/gemfiles/active_record-rails40.gemfile +7 -0
  11. data/gemfiles/active_record-rails41.gemfile +7 -0
  12. data/lib/generators/sorcery/USAGE +22 -0
  13. data/lib/generators/sorcery/helpers.rb +40 -0
  14. data/lib/generators/sorcery/install_generator.rb +95 -0
  15. data/lib/generators/sorcery/templates/initializer.rb +451 -0
  16. data/lib/generators/sorcery/templates/migration/activity_logging.rb +10 -0
  17. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +9 -0
  18. data/lib/generators/sorcery/templates/migration/core.rb +13 -0
  19. data/lib/generators/sorcery/templates/migration/external.rb +12 -0
  20. data/lib/generators/sorcery/templates/migration/remember_me.rb +8 -0
  21. data/lib/generators/sorcery/templates/migration/reset_password.rb +9 -0
  22. data/lib/generators/sorcery/templates/migration/user_activation.rb +9 -0
  23. data/lib/sorcery.rb +85 -0
  24. data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
  25. data/lib/sorcery/adapters/base_adapter.rb +30 -0
  26. data/lib/sorcery/controller.rb +157 -0
  27. data/lib/sorcery/controller/config.rb +65 -0
  28. data/lib/sorcery/controller/submodules/activity_logging.rb +82 -0
  29. data/lib/sorcery/controller/submodules/brute_force_protection.rb +38 -0
  30. data/lib/sorcery/controller/submodules/external.rb +199 -0
  31. data/lib/sorcery/controller/submodules/http_basic_auth.rb +74 -0
  32. data/lib/sorcery/controller/submodules/remember_me.rb +81 -0
  33. data/lib/sorcery/controller/submodules/session_timeout.rb +56 -0
  34. data/lib/sorcery/crypto_providers/aes256.rb +51 -0
  35. data/lib/sorcery/crypto_providers/bcrypt.rb +97 -0
  36. data/lib/sorcery/crypto_providers/common.rb +35 -0
  37. data/lib/sorcery/crypto_providers/md5.rb +19 -0
  38. data/lib/sorcery/crypto_providers/sha1.rb +28 -0
  39. data/lib/sorcery/crypto_providers/sha256.rb +36 -0
  40. data/lib/sorcery/crypto_providers/sha512.rb +36 -0
  41. data/lib/sorcery/engine.rb +21 -0
  42. data/lib/sorcery/model.rb +183 -0
  43. data/lib/sorcery/model/config.rb +96 -0
  44. data/lib/sorcery/model/submodules/activity_logging.rb +70 -0
  45. data/lib/sorcery/model/submodules/brute_force_protection.rb +125 -0
  46. data/lib/sorcery/model/submodules/external.rb +100 -0
  47. data/lib/sorcery/model/submodules/remember_me.rb +62 -0
  48. data/lib/sorcery/model/submodules/reset_password.rb +131 -0
  49. data/lib/sorcery/model/submodules/user_activation.rb +149 -0
  50. data/lib/sorcery/model/temporary_token.rb +30 -0
  51. data/lib/sorcery/protocols/certs/ca-bundle.crt +5182 -0
  52. data/lib/sorcery/protocols/oauth.rb +42 -0
  53. data/lib/sorcery/protocols/oauth2.rb +47 -0
  54. data/lib/sorcery/providers/base.rb +27 -0
  55. data/lib/sorcery/providers/facebook.rb +63 -0
  56. data/lib/sorcery/providers/github.rb +51 -0
  57. data/lib/sorcery/providers/google.rb +51 -0
  58. data/lib/sorcery/providers/jira.rb +77 -0
  59. data/lib/sorcery/providers/linkedin.rb +66 -0
  60. data/lib/sorcery/providers/liveid.rb +53 -0
  61. data/lib/sorcery/providers/twitter.rb +59 -0
  62. data/lib/sorcery/providers/vk.rb +63 -0
  63. data/lib/sorcery/providers/xing.rb +64 -0
  64. data/lib/sorcery/railties/tasks.rake +6 -0
  65. data/lib/sorcery/test_helpers/internal.rb +78 -0
  66. data/lib/sorcery/test_helpers/internal/rails.rb +68 -0
  67. data/lib/sorcery/test_helpers/rails/controller.rb +21 -0
  68. data/lib/sorcery/test_helpers/rails/integration.rb +26 -0
  69. data/lib/sorcery/version.rb +3 -0
  70. data/sorcery.gemspec +34 -0
  71. data/spec/active_record/user_activation_spec.rb +18 -0
  72. data/spec/active_record/user_activity_logging_spec.rb +17 -0
  73. data/spec/active_record/user_brute_force_protection_spec.rb +16 -0
  74. data/spec/active_record/user_oauth_spec.rb +16 -0
  75. data/spec/active_record/user_remember_me_spec.rb +16 -0
  76. data/spec/active_record/user_reset_password_spec.rb +16 -0
  77. data/spec/active_record/user_spec.rb +37 -0
  78. data/spec/controllers/controller_activity_logging_spec.rb +124 -0
  79. data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
  80. data/spec/controllers/controller_http_basic_auth_spec.rb +68 -0
  81. data/spec/controllers/controller_oauth2_spec.rb +407 -0
  82. data/spec/controllers/controller_oauth_spec.rb +240 -0
  83. data/spec/controllers/controller_remember_me_spec.rb +117 -0
  84. data/spec/controllers/controller_session_timeout_spec.rb +80 -0
  85. data/spec/controllers/controller_spec.rb +215 -0
  86. data/spec/orm/active_record.rb +21 -0
  87. data/spec/rails_app/app/active_record/authentication.rb +3 -0
  88. data/spec/rails_app/app/active_record/user.rb +5 -0
  89. data/spec/rails_app/app/active_record/user_provider.rb +3 -0
  90. data/spec/rails_app/app/controllers/sorcery_controller.rb +265 -0
  91. data/spec/rails_app/app/helpers/application_helper.rb +2 -0
  92. data/spec/rails_app/app/mailers/sorcery_mailer.rb +32 -0
  93. data/spec/rails_app/app/views/application/index.html.erb +17 -0
  94. data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
  95. data/spec/rails_app/app/views/sorcery_mailer/activation_email.html.erb +17 -0
  96. data/spec/rails_app/app/views/sorcery_mailer/activation_email.text.erb +9 -0
  97. data/spec/rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb +17 -0
  98. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.html.erb +17 -0
  99. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.text.erb +9 -0
  100. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.html.erb +16 -0
  101. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.text.erb +8 -0
  102. data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +1 -0
  103. data/spec/rails_app/config.ru +4 -0
  104. data/spec/rails_app/config/application.rb +56 -0
  105. data/spec/rails_app/config/boot.rb +4 -0
  106. data/spec/rails_app/config/database.yml +22 -0
  107. data/spec/rails_app/config/environment.rb +5 -0
  108. data/spec/rails_app/config/environments/test.rb +37 -0
  109. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  110. data/spec/rails_app/config/initializers/inflections.rb +10 -0
  111. data/spec/rails_app/config/initializers/mime_types.rb +5 -0
  112. data/spec/rails_app/config/initializers/secret_token.rb +7 -0
  113. data/spec/rails_app/config/initializers/session_store.rb +12 -0
  114. data/spec/rails_app/config/locales/en.yml +5 -0
  115. data/spec/rails_app/config/routes.rb +48 -0
  116. data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +17 -0
  117. data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +19 -0
  118. data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +13 -0
  119. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +16 -0
  120. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +22 -0
  121. data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +15 -0
  122. data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +13 -0
  123. data/spec/rails_app/db/schema.rb +23 -0
  124. data/spec/rails_app/db/seeds.rb +7 -0
  125. data/spec/shared_examples/user_activation_shared_examples.rb +242 -0
  126. data/spec/shared_examples/user_activity_logging_shared_examples.rb +97 -0
  127. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +156 -0
  128. data/spec/shared_examples/user_oauth_shared_examples.rb +36 -0
  129. data/spec/shared_examples/user_remember_me_shared_examples.rb +57 -0
  130. data/spec/shared_examples/user_reset_password_shared_examples.rb +263 -0
  131. data/spec/shared_examples/user_shared_examples.rb +467 -0
  132. data/spec/sorcery_crypto_providers_spec.rb +198 -0
  133. data/spec/spec.opts +2 -0
  134. data/spec/spec_helper.rb +41 -0
  135. metadata +350 -0
@@ -0,0 +1,21 @@
1
+ require 'sorcery'
2
+
3
+ ActiveRecord::Migration.verbose = false
4
+ # ActiveRecord::Base.logger = Logger.new(nil)
5
+ # ActiveRecord::Base.include_root_in_json = true
6
+
7
+ class TestUser < ActiveRecord::Base
8
+ authenticates_with_sorcery!
9
+ end
10
+
11
+ def setup_orm
12
+ ActiveRecord::Migrator.migrate(migrations_path)
13
+ end
14
+
15
+ def teardown_orm
16
+ ActiveRecord::Migrator.rollback(migrations_path)
17
+ end
18
+
19
+ def migrations_path
20
+ Rails.root.join("db", "migrate", "core")
21
+ end
@@ -0,0 +1,3 @@
1
+ class Authentication < ActiveRecord::Base
2
+ belongs_to :user
3
+ end
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+ has_many :authentications, :dependent => :destroy
3
+ has_many :user_providers, :dependent => :destroy
4
+ accepts_nested_attributes_for :authentications
5
+ end
@@ -0,0 +1,3 @@
1
+ class UserProvider < ActiveRecord::Base
2
+ belongs_to :user
3
+ end
@@ -0,0 +1,265 @@
1
+ require 'oauth'
2
+
3
+ class SorceryController < ActionController::Base
4
+ protect_from_forgery
5
+
6
+ before_filter :require_login_from_http_basic, only: [:test_http_basic_auth]
7
+ before_filter :require_login, only: [:test_logout, :test_should_be_logged_in, :some_action]
8
+
9
+ def index
10
+ end
11
+
12
+ def some_action
13
+ render nothing: true
14
+ end
15
+
16
+ def some_action_making_a_non_persisted_change_to_the_user
17
+ current_user.email = 'to_be_ignored'
18
+ render nothing: true
19
+ end
20
+
21
+ def test_login
22
+ @user = login(params[:email], params[:password])
23
+ render nothing: true
24
+ end
25
+
26
+ def test_auto_login
27
+ @user = User.first
28
+ auto_login(@user)
29
+ @result = current_user
30
+ render nothing: true
31
+ end
32
+
33
+ def test_return_to
34
+ @user = login(params[:email], params[:password])
35
+ redirect_back_or_to(:index, notice: 'haha!')
36
+ end
37
+
38
+ def test_logout
39
+ logout
40
+ render nothing: true
41
+ end
42
+
43
+ def test_logout_with_remember
44
+ remember_me!
45
+ logout
46
+ render nothing: true
47
+ end
48
+
49
+ def test_login_with_remember
50
+ @user = login(params[:email], params[:password])
51
+ remember_me!
52
+
53
+ render nothing: true
54
+ end
55
+
56
+ def test_login_with_remember_in_login
57
+ @user = login(params[:email], params[:password], params[:remember])
58
+
59
+ render nothing: true
60
+ end
61
+
62
+ def test_login_from_cookie
63
+ @user = current_user
64
+ render nothing: true
65
+ end
66
+
67
+ def test_not_authenticated_action
68
+ render text: 'test_not_authenticated_action'
69
+ end
70
+
71
+ def test_should_be_logged_in
72
+ render nothing: true
73
+ end
74
+
75
+ def test_http_basic_auth
76
+ render text: 'HTTP Basic Auth'
77
+ end
78
+
79
+ def login_at_test_twitter
80
+ login_at(:twitter)
81
+ end
82
+
83
+ alias :login_at_test :login_at_test_twitter
84
+
85
+ def login_at_test_facebook
86
+ login_at(:facebook)
87
+ end
88
+
89
+ def login_at_test_github
90
+ login_at(:github)
91
+ end
92
+
93
+ def login_at_test_google
94
+ login_at(:google)
95
+ end
96
+
97
+ def login_at_test_liveid
98
+ login_at(:liveid)
99
+ end
100
+
101
+ def login_at_test_jira
102
+ login_at(:jira)
103
+ end
104
+
105
+ def login_at_test_vk
106
+ login_at(:vk)
107
+ end
108
+
109
+ def login_at_test_with_state
110
+ login_at(:facebook, {state: 'bla'})
111
+ end
112
+
113
+ def test_login_from_twitter
114
+ if @user = login_from(:twitter)
115
+ redirect_to 'bla', notice: 'Success!'
116
+ else
117
+ redirect_to 'blu', alert: 'Failed!'
118
+ end
119
+ end
120
+
121
+ alias :test_login_from :test_login_from_twitter
122
+
123
+ def test_login_from_facebook
124
+ if @user = login_from(:facebook)
125
+ redirect_to 'bla', notice: 'Success!'
126
+ else
127
+ redirect_to 'blu', alert: 'Failed!'
128
+ end
129
+ end
130
+
131
+ def test_login_from_github
132
+ if @user = login_from(:github)
133
+ redirect_to 'bla', notice: 'Success!'
134
+ else
135
+ redirect_to 'blu', alert: 'Failed!'
136
+ end
137
+ end
138
+
139
+ def test_login_from_google
140
+ if @user = login_from(:google)
141
+ redirect_to 'bla', notice: 'Success!'
142
+ else
143
+ redirect_to 'blu', alert: 'Failed!'
144
+ end
145
+ end
146
+
147
+ def test_login_from_liveid
148
+ if @user = login_from(:liveid)
149
+ redirect_to 'bla', notice: 'Success!'
150
+ else
151
+ redirect_to 'blu', alert: 'Failed!'
152
+ end
153
+ end
154
+
155
+ def test_login_from_vk
156
+ if @user = login_from(:vk)
157
+ redirect_to 'bla', notice: 'Success!'
158
+ else
159
+ redirect_to 'blu', alert: 'Failed!'
160
+ end
161
+ end
162
+
163
+ def test_login_from_jira
164
+ if @user = login_from(:jira)
165
+ redirect_to 'bla', notice: 'Success!'
166
+ else
167
+ redirect_to 'blu', alert: 'Failed!'
168
+ end
169
+ end
170
+
171
+ def test_return_to_with_external_twitter
172
+ if @user = login_from(:twitter)
173
+ redirect_back_or_to 'bla', notice: 'Success!'
174
+ else
175
+ redirect_to 'blu', alert: 'Failed!'
176
+ end
177
+ end
178
+
179
+ def test_return_to_with_external_jira
180
+ if @user = login_from(:jira)
181
+ redirect_back_or_to 'bla', notice: 'Success!'
182
+ else
183
+ redirect_to 'blu', alert: 'Failed!'
184
+ end
185
+ end
186
+
187
+ alias :test_return_to_with_external :test_return_to_with_external_twitter
188
+
189
+ def test_return_to_with_external_facebook
190
+ if @user = login_from(:facebook)
191
+ redirect_back_or_to 'bla', notice: 'Success!'
192
+ else
193
+ redirect_to 'blu', alert: 'Failed!'
194
+ end
195
+ end
196
+
197
+ def test_return_to_with_external_github
198
+ if @user = login_from(:github)
199
+ redirect_back_or_to 'bla', notice: 'Success!'
200
+ else
201
+ redirect_to 'blu', alert: 'Failed!'
202
+ end
203
+ end
204
+
205
+ def test_return_to_with_external_google
206
+ if @user = login_from(:google)
207
+ redirect_back_or_to 'bla', notice: 'Success!'
208
+ else
209
+ redirect_to 'blu', alert: 'Failed!'
210
+ end
211
+ end
212
+
213
+ def test_return_to_with_external_liveid
214
+ if @user = login_from(:liveid)
215
+ redirect_back_or_to 'bla', notice: 'Success!'
216
+ else
217
+ redirect_to 'blu', alert: 'Failed!'
218
+ end
219
+ end
220
+
221
+ def test_return_to_with_external_vk
222
+ if @user = login_from(:vk)
223
+ redirect_back_or_to 'bla', notice: 'Success!'
224
+ else
225
+ redirect_to 'blu', alert: 'Failed!'
226
+ end
227
+ end
228
+
229
+ def test_create_from_provider
230
+ provider = params[:provider]
231
+ login_from(provider)
232
+ if @user = create_from(provider)
233
+ redirect_to 'bla', notice: 'Success!'
234
+ else
235
+ redirect_to 'blu', alert: 'Failed!'
236
+ end
237
+ end
238
+
239
+ def test_add_second_provider
240
+ provider = params[:provider]
241
+ if logged_in?
242
+ if @user = add_provider_to_user(provider)
243
+ redirect_to "bla", :notice => "Success!"
244
+ else
245
+ redirect_to "blu", :alert => "Failed!"
246
+ end
247
+ end
248
+ end
249
+
250
+ def test_create_from_provider_with_block
251
+ provider = params[:provider]
252
+ login_from(provider)
253
+ @user = create_from(provider) do |user|
254
+ # check uniqueness of email
255
+ # User.where(email: user.email).empty?
256
+ false
257
+ end
258
+ if @user
259
+ redirect_to 'bla', notice: 'Success!'
260
+ else
261
+ redirect_to 'blu', alert: 'Failed!'
262
+ end
263
+ end
264
+
265
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,32 @@
1
+ class SorceryMailer < ActionMailer::Base
2
+
3
+ default :from => "notifications@example.com"
4
+
5
+ def activation_needed_email(user)
6
+ @user = user
7
+ @url = "http://example.com/login"
8
+ mail(:to => user.email,
9
+ :subject => "Welcome to My Awesome Site")
10
+ end
11
+
12
+ def activation_success_email(user)
13
+ @user = user
14
+ @url = "http://example.com/login"
15
+ mail(:to => user.email,
16
+ :subject => "Your account is now activated")
17
+ end
18
+
19
+ def reset_password_email(user)
20
+ @user = user
21
+ @url = "http://example.com/login"
22
+ mail(:to => user.email,
23
+ :subject => "Your password has been reset")
24
+ end
25
+
26
+ def send_unlock_token_email(user)
27
+ @user = user
28
+ @url = "http://example.com/unlock/#{user.unlock_token}"
29
+ mail(:to => user.email,
30
+ :subject => "Your account has been locked due to many wrong logins")
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ <%= form_tag :action => :test_login, :method => :post do %>
2
+ <div class="field">
3
+ <%= label_tag :username %><br />
4
+ <%= text_field_tag :username %>
5
+ </div>
6
+ <div class="field">
7
+ <%= label_tag :password %><br />
8
+ <%= password_field_tag :password %>
9
+ </div>
10
+ <div class="actions">
11
+ <%= submit_tag "Login" %>
12
+ </div>
13
+ <div>
14
+ <%= label_tag "keep me logged in" %><br />
15
+ <%= check_box_tag :remember %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>AppRoot</title>
5
+ <%= stylesheet_link_tag :all %>
6
+ <%= javascript_include_tag :defaults %>
7
+ <%= csrf_meta_tag %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5
+ </head>
6
+ <body>
7
+ <h1>Welcome to example.com, <%= @user.username %></h1>
8
+ <p>
9
+ You have successfully signed up to example.com,
10
+ your username is: <%= @user.username %>.<br/>
11
+ </p>
12
+ <p>
13
+ To login to the site, just follow this link: <%= @url %>.
14
+ </p>
15
+ <p>Thanks for joining and have a great day!</p>
16
+ </body>
17
+ </html>
@@ -0,0 +1,9 @@
1
+ Welcome to example.com, <%= @user.username %>
2
+ ===============================================
3
+
4
+ You have successfully signed up to example.com,
5
+ your username is: <%= @user.username %>.
6
+
7
+ To login to the site, just follow this link: <%= @url %>.
8
+
9
+ Thanks for joining and have a great day!
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5
+ </head>
6
+ <body>
7
+ <h1>Congratz, <%= @user.username %></h1>
8
+ <p>
9
+ You have successfully activated your example.com account,
10
+ your username is: <%= @user.username %>.<br/>
11
+ </p>
12
+ <p>
13
+ To login to the site, just follow this link: <%= @url %>.
14
+ </p>
15
+ <p>Thanks for joining and have a great day!</p>
16
+ </body>
17
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5
+ </head>
6
+ <body>
7
+ <h1>Congratz, <%= @user.username %></h1>
8
+ <p>
9
+ You have successfully activated your example.com account,
10
+ your username is: <%= @user.username %>.<br/>
11
+ </p>
12
+ <p>
13
+ To login to the site, just follow this link: <%= @url %>.
14
+ </p>
15
+ <p>Thanks for joining and have a great day!</p>
16
+ </body>
17
+ </html>
@@ -0,0 +1,9 @@
1
+ Congratz, <%= @user.username %>
2
+ ===============================================
3
+
4
+ You have successfully activated your example.com account,
5
+ your username is: <%= @user.username %>.
6
+
7
+ To login to the site, just follow this link: <%= @url %>.
8
+
9
+ Thanks for joining and have a great day!