devise 3.2.4 → 4.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +259 -994
- data/MIT-LICENSE +1 -1
- data/README.md +336 -99
- data/app/controllers/devise/confirmations_controller.rb +9 -3
- data/app/controllers/devise/omniauth_callbacks_controller.rb +12 -6
- data/app/controllers/devise/passwords_controller.rb +19 -6
- data/app/controllers/devise/registrations_controller.rb +55 -22
- data/app/controllers/devise/sessions_controller.rb +44 -14
- data/app/controllers/devise/unlocks_controller.rb +7 -2
- data/app/controllers/devise_controller.rb +65 -29
- data/app/helpers/devise_helper.rb +12 -19
- data/app/mailers/devise/mailer.rb +10 -0
- data/app/views/devise/confirmations/new.html.erb +8 -4
- data/app/views/devise/mailer/email_changed.html.erb +7 -0
- data/app/views/devise/mailer/password_change.html.erb +3 -0
- data/app/views/devise/passwords/edit.html.erb +15 -6
- data/app/views/devise/passwords/new.html.erb +8 -4
- data/app/views/devise/registrations/edit.html.erb +27 -13
- data/app/views/devise/registrations/new.html.erb +19 -8
- data/app/views/devise/sessions/new.html.erb +18 -9
- data/app/views/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/devise/shared/{_links.erb → _links.html.erb} +9 -9
- data/app/views/devise/unlocks/new.html.erb +8 -4
- data/config/locales/en.yml +22 -16
- data/lib/devise/controllers/helpers.rb +109 -29
- data/lib/devise/controllers/rememberable.rb +12 -3
- data/lib/devise/controllers/scoped_views.rb +2 -0
- data/lib/devise/controllers/sign_in_out.rb +36 -20
- data/lib/devise/controllers/store_location.rb +31 -5
- data/lib/devise/controllers/url_helpers.rb +9 -7
- data/lib/devise/delegator.rb +2 -0
- data/lib/devise/encryptor.rb +24 -0
- data/lib/devise/failure_app.rb +116 -36
- data/lib/devise/hooks/activatable.rb +5 -4
- data/lib/devise/hooks/csrf_cleaner.rb +5 -1
- data/lib/devise/hooks/forgetable.rb +2 -0
- data/lib/devise/hooks/lockable.rb +6 -1
- data/lib/devise/hooks/proxy.rb +3 -1
- data/lib/devise/hooks/rememberable.rb +2 -0
- data/lib/devise/hooks/timeoutable.rb +15 -8
- data/lib/devise/hooks/trackable.rb +2 -0
- data/lib/devise/mailers/helpers.rb +7 -4
- data/lib/devise/mapping.rb +8 -2
- data/lib/devise/models/authenticatable.rb +76 -51
- data/lib/devise/models/confirmable.rb +129 -34
- data/lib/devise/models/database_authenticatable.rb +107 -30
- data/lib/devise/models/lockable.rb +19 -9
- data/lib/devise/models/omniauthable.rb +2 -0
- data/lib/devise/models/recoverable.rb +62 -26
- data/lib/devise/models/registerable.rb +4 -0
- data/lib/devise/models/rememberable.rb +58 -29
- data/lib/devise/models/timeoutable.rb +2 -6
- data/lib/devise/models/trackable.rb +20 -4
- data/lib/devise/models/validatable.rb +12 -5
- data/lib/devise/models.rb +3 -1
- data/lib/devise/modules.rb +2 -0
- data/lib/devise/omniauth/config.rb +2 -0
- data/lib/devise/omniauth/url_helpers.rb +14 -5
- data/lib/devise/omniauth.rb +2 -0
- data/lib/devise/orm/active_record.rb +5 -1
- data/lib/devise/orm/mongoid.rb +6 -2
- data/lib/devise/parameter_filter.rb +4 -0
- data/lib/devise/parameter_sanitizer.rb +139 -65
- data/lib/devise/rails/routes.rb +80 -61
- data/lib/devise/rails/warden_compat.rb +3 -10
- data/lib/devise/rails.rb +8 -17
- data/lib/devise/secret_key_finder.rb +27 -0
- data/lib/devise/strategies/authenticatable.rb +18 -7
- data/lib/devise/strategies/base.rb +2 -0
- data/lib/devise/strategies/database_authenticatable.rb +13 -5
- data/lib/devise/strategies/rememberable.rb +15 -3
- data/lib/devise/test/controller_helpers.rb +165 -0
- data/lib/devise/test/integration_helpers.rb +63 -0
- data/lib/devise/test_helpers.rb +7 -124
- data/lib/devise/time_inflector.rb +2 -0
- data/lib/devise/token_generator.rb +3 -41
- data/lib/devise/version.rb +3 -1
- data/lib/devise.rb +106 -79
- data/lib/generators/active_record/devise_generator.rb +44 -7
- data/lib/generators/active_record/templates/migration.rb +5 -3
- data/lib/generators/active_record/templates/migration_existing.rb +5 -3
- data/lib/generators/devise/controllers_generator.rb +46 -0
- data/lib/generators/devise/devise_generator.rb +4 -2
- data/lib/generators/devise/install_generator.rb +17 -0
- data/lib/generators/devise/orm_helpers.rb +10 -21
- data/lib/generators/devise/views_generator.rb +21 -11
- data/lib/generators/mongoid/devise_generator.rb +7 -5
- data/lib/generators/templates/README +2 -9
- data/lib/generators/templates/controllers/README +14 -0
- data/lib/generators/templates/controllers/confirmations_controller.rb +30 -0
- data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +30 -0
- data/lib/generators/templates/controllers/passwords_controller.rb +34 -0
- data/lib/generators/templates/controllers/registrations_controller.rb +62 -0
- data/lib/generators/templates/controllers/sessions_controller.rb +27 -0
- data/lib/generators/templates/controllers/unlocks_controller.rb +30 -0
- data/lib/generators/templates/devise.rb +69 -30
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/email_changed.markerb +7 -0
- data/lib/generators/templates/markerb/password_change.markerb +3 -0
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +11 -3
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +9 -4
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
- metadata +31 -259
- data/.gitignore +0 -11
- data/.travis.yml +0 -28
- data/.yardopts +0 -9
- data/CONTRIBUTING.md +0 -14
- data/Gemfile +0 -29
- data/Gemfile.lock +0 -160
- data/Rakefile +0 -35
- data/devise.gemspec +0 -27
- data/devise.png +0 -0
- data/gemfiles/Gemfile.rails-3.2-stable +0 -29
- data/gemfiles/Gemfile.rails-4.0-stable +0 -29
- data/gemfiles/Gemfile.rails-head +0 -29
- data/test/controllers/custom_strategy_test.rb +0 -62
- data/test/controllers/helpers_test.rb +0 -276
- data/test/controllers/internal_helpers_test.rb +0 -123
- data/test/controllers/passwords_controller_test.rb +0 -31
- data/test/controllers/sessions_controller_test.rb +0 -103
- data/test/controllers/url_helpers_test.rb +0 -59
- data/test/delegator_test.rb +0 -19
- data/test/devise_test.rb +0 -94
- data/test/failure_app_test.rb +0 -232
- data/test/generators/active_record_generator_test.rb +0 -103
- data/test/generators/devise_generator_test.rb +0 -39
- data/test/generators/install_generator_test.rb +0 -13
- data/test/generators/mongoid_generator_test.rb +0 -23
- data/test/generators/views_generator_test.rb +0 -96
- data/test/helpers/devise_helper_test.rb +0 -51
- data/test/integration/authenticatable_test.rb +0 -713
- data/test/integration/confirmable_test.rb +0 -284
- data/test/integration/database_authenticatable_test.rb +0 -84
- data/test/integration/http_authenticatable_test.rb +0 -105
- data/test/integration/lockable_test.rb +0 -239
- data/test/integration/omniauthable_test.rb +0 -133
- data/test/integration/recoverable_test.rb +0 -334
- data/test/integration/registerable_test.rb +0 -349
- data/test/integration/rememberable_test.rb +0 -167
- data/test/integration/timeoutable_test.rb +0 -183
- data/test/integration/trackable_test.rb +0 -92
- data/test/mailers/confirmation_instructions_test.rb +0 -115
- data/test/mailers/reset_password_instructions_test.rb +0 -96
- data/test/mailers/unlock_instructions_test.rb +0 -91
- data/test/mapping_test.rb +0 -127
- data/test/models/authenticatable_test.rb +0 -13
- data/test/models/confirmable_test.rb +0 -454
- data/test/models/database_authenticatable_test.rb +0 -249
- data/test/models/lockable_test.rb +0 -316
- data/test/models/omniauthable_test.rb +0 -7
- data/test/models/recoverable_test.rb +0 -184
- data/test/models/registerable_test.rb +0 -7
- data/test/models/rememberable_test.rb +0 -183
- data/test/models/serializable_test.rb +0 -49
- data/test/models/timeoutable_test.rb +0 -51
- data/test/models/trackable_test.rb +0 -13
- data/test/models/validatable_test.rb +0 -127
- data/test/models_test.rb +0 -144
- data/test/omniauth/config_test.rb +0 -57
- data/test/omniauth/url_helpers_test.rb +0 -54
- data/test/orm/active_record.rb +0 -10
- data/test/orm/mongoid.rb +0 -13
- data/test/parameter_sanitizer_test.rb +0 -81
- data/test/rails_app/Rakefile +0 -6
- data/test/rails_app/app/active_record/admin.rb +0 -6
- data/test/rails_app/app/active_record/shim.rb +0 -2
- data/test/rails_app/app/active_record/user.rb +0 -6
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
- data/test/rails_app/app/controllers/admins_controller.rb +0 -11
- data/test/rails_app/app/controllers/application_controller.rb +0 -9
- data/test/rails_app/app/controllers/home_controller.rb +0 -25
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
- data/test/rails_app/app/controllers/users_controller.rb +0 -31
- data/test/rails_app/app/helpers/application_helper.rb +0 -3
- data/test/rails_app/app/mailers/users/mailer.rb +0 -12
- data/test/rails_app/app/mongoid/admin.rb +0 -29
- data/test/rails_app/app/mongoid/shim.rb +0 -23
- data/test/rails_app/app/mongoid/user.rb +0 -39
- data/test/rails_app/app/views/admins/index.html.erb +0 -1
- data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
- data/test/rails_app/app/views/home/index.html.erb +0 -1
- data/test/rails_app/app/views/home/join.html.erb +0 -1
- data/test/rails_app/app/views/home/private.html.erb +0 -1
- data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
- data/test/rails_app/app/views/layouts/application.html.erb +0 -24
- data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
- data/test/rails_app/app/views/users/index.html.erb +0 -1
- data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
- data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
- data/test/rails_app/bin/bundle +0 -3
- data/test/rails_app/bin/rails +0 -4
- data/test/rails_app/bin/rake +0 -4
- data/test/rails_app/config/application.rb +0 -40
- data/test/rails_app/config/boot.rb +0 -14
- data/test/rails_app/config/database.yml +0 -18
- data/test/rails_app/config/environment.rb +0 -5
- data/test/rails_app/config/environments/development.rb +0 -30
- data/test/rails_app/config/environments/production.rb +0 -80
- data/test/rails_app/config/environments/test.rb +0 -36
- data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
- data/test/rails_app/config/initializers/devise.rb +0 -181
- data/test/rails_app/config/initializers/inflections.rb +0 -2
- data/test/rails_app/config/initializers/secret_token.rb +0 -8
- data/test/rails_app/config/initializers/session_store.rb +0 -1
- data/test/rails_app/config/routes.rb +0 -105
- data/test/rails_app/config.ru +0 -4
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -71
- data/test/rails_app/db/schema.rb +0 -55
- data/test/rails_app/lib/shared_admin.rb +0 -17
- data/test/rails_app/lib/shared_user.rb +0 -29
- data/test/rails_app/public/404.html +0 -26
- data/test/rails_app/public/422.html +0 -26
- data/test/rails_app/public/500.html +0 -26
- data/test/rails_app/public/favicon.ico +0 -0
- data/test/routes_test.rb +0 -262
- data/test/support/action_controller/record_identifier.rb +0 -10
- data/test/support/assertions.rb +0 -40
- data/test/support/helpers.rb +0 -70
- data/test/support/integration.rb +0 -92
- data/test/support/locale/en.yml +0 -8
- data/test/support/mongoid.yml +0 -6
- data/test/support/webrat/integrations/rails.rb +0 -24
- data/test/test_helper.rb +0 -27
- data/test/test_helpers_test.rb +0 -173
- data/test/test_models.rb +0 -33
@@ -1,16 +1,25 @@
|
|
1
1
|
<h2>Change your password</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
<%= f.hidden_field :reset_password_token %>
|
6
6
|
|
7
|
-
<div
|
8
|
-
<%= f.
|
7
|
+
<div class="field">
|
8
|
+
<%= f.label :password, "New password" %><br />
|
9
|
+
<% if @minimum_password_length %>
|
10
|
+
<em>(<%= @minimum_password_length %> characters minimum)</em><br />
|
11
|
+
<% end %>
|
12
|
+
<%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
|
13
|
+
</div>
|
9
14
|
|
10
|
-
<div
|
11
|
-
<%= f.
|
15
|
+
<div class="field">
|
16
|
+
<%= f.label :password_confirmation, "Confirm new password" %><br />
|
17
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
|
18
|
+
</div>
|
12
19
|
|
13
|
-
<div
|
20
|
+
<div class="actions">
|
21
|
+
<%= f.submit "Change my password" %>
|
22
|
+
</div>
|
14
23
|
<% end %>
|
15
24
|
|
16
25
|
<%= render "devise/shared/links" %>
|
@@ -1,12 +1,16 @@
|
|
1
1
|
<h2>Forgot your password?</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
|
-
<div
|
7
|
-
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
|
+
</div>
|
8
10
|
|
9
|
-
<div
|
11
|
+
<div class="actions">
|
12
|
+
<%= f.submit "Send me reset password instructions" %>
|
13
|
+
</div>
|
10
14
|
<% end %>
|
11
15
|
|
12
16
|
<%= render "devise/shared/links" %>
|
@@ -1,25 +1,39 @@
|
|
1
1
|
<h2>Edit <%= resource_name.to_s.humanize %></h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
|
-
<div
|
7
|
-
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
|
+
</div>
|
8
10
|
|
9
11
|
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
|
10
12
|
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
|
11
13
|
<% end %>
|
12
14
|
|
13
|
-
<div
|
14
|
-
<%= f.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
<div
|
15
|
+
<div class="field">
|
16
|
+
<%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
|
17
|
+
<%= f.password_field :password, autocomplete: "new-password" %>
|
18
|
+
<% if @minimum_password_length %>
|
19
|
+
<br />
|
20
|
+
<em><%= @minimum_password_length %> characters minimum</em>
|
21
|
+
<% end %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="field">
|
25
|
+
<%= f.label :password_confirmation %><br />
|
26
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div class="field">
|
30
|
+
<%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
|
31
|
+
<%= f.password_field :current_password, autocomplete: "current-password" %>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<div class="actions">
|
35
|
+
<%= f.submit "Update" %>
|
36
|
+
</div>
|
23
37
|
<% end %>
|
24
38
|
|
25
39
|
<h3>Cancel my account</h3>
|
@@ -1,18 +1,29 @@
|
|
1
1
|
<h2>Sign up</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
|
-
<div
|
7
|
-
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
|
+
</div>
|
8
10
|
|
9
|
-
<div
|
10
|
-
<%= f.
|
11
|
+
<div class="field">
|
12
|
+
<%= f.label :password %>
|
13
|
+
<% if @minimum_password_length %>
|
14
|
+
<em>(<%= @minimum_password_length %> characters minimum)</em>
|
15
|
+
<% end %><br />
|
16
|
+
<%= f.password_field :password, autocomplete: "new-password" %>
|
17
|
+
</div>
|
11
18
|
|
12
|
-
<div
|
13
|
-
<%= f.
|
19
|
+
<div class="field">
|
20
|
+
<%= f.label :password_confirmation %><br />
|
21
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
|
22
|
+
</div>
|
14
23
|
|
15
|
-
<div
|
24
|
+
<div class="actions">
|
25
|
+
<%= f.submit "Sign up" %>
|
26
|
+
</div>
|
16
27
|
<% end %>
|
17
28
|
|
18
29
|
<%= render "devise/shared/links" %>
|
@@ -1,17 +1,26 @@
|
|
1
|
-
<h2>
|
1
|
+
<h2>Log in</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
|
4
|
-
<div
|
5
|
-
|
4
|
+
<div class="field">
|
5
|
+
<%= f.label :email %><br />
|
6
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
7
|
+
</div>
|
6
8
|
|
7
|
-
<div
|
8
|
-
<%= f.
|
9
|
+
<div class="field">
|
10
|
+
<%= f.label :password %><br />
|
11
|
+
<%= f.password_field :password, autocomplete: "current-password" %>
|
12
|
+
</div>
|
9
13
|
|
10
|
-
<% if devise_mapping.rememberable?
|
11
|
-
<div
|
12
|
-
|
14
|
+
<% if devise_mapping.rememberable? %>
|
15
|
+
<div class="field">
|
16
|
+
<%= f.check_box :remember_me %>
|
17
|
+
<%= f.label :remember_me %>
|
18
|
+
</div>
|
19
|
+
<% end %>
|
13
20
|
|
14
|
-
<div
|
21
|
+
<div class="actions">
|
22
|
+
<%= f.submit "Log in" %>
|
23
|
+
</div>
|
15
24
|
<% end %>
|
16
25
|
|
17
26
|
<%= render "devise/shared/links" %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<% if resource.errors.any? %>
|
2
|
+
<div id="error_explanation">
|
3
|
+
<h2>
|
4
|
+
<%= I18n.t("errors.messages.not_saved",
|
5
|
+
count: resource.errors.count,
|
6
|
+
resource: resource.class.model_name.human.downcase)
|
7
|
+
%>
|
8
|
+
</h2>
|
9
|
+
<ul>
|
10
|
+
<% resource.errors.full_messages.each do |message| %>
|
11
|
+
<li><%= message %></li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
@@ -1,25 +1,25 @@
|
|
1
1
|
<%- if controller_name != 'sessions' %>
|
2
|
-
<%= link_to "
|
3
|
-
<% end
|
2
|
+
<%= link_to "Log in", new_session_path(resource_name) %><br />
|
3
|
+
<% end %>
|
4
4
|
|
5
5
|
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
|
6
6
|
<%= link_to "Sign up", new_registration_path(resource_name) %><br />
|
7
|
-
<% end
|
7
|
+
<% end %>
|
8
8
|
|
9
9
|
<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
|
10
10
|
<%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
|
11
|
-
<% end
|
11
|
+
<% end %>
|
12
12
|
|
13
13
|
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
14
14
|
<%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
|
15
|
-
<% end
|
15
|
+
<% end %>
|
16
16
|
|
17
17
|
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
|
18
18
|
<%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
|
19
|
-
<% end
|
19
|
+
<% end %>
|
20
20
|
|
21
21
|
<%- if devise_mapping.omniauthable? %>
|
22
22
|
<%- resource_class.omniauth_providers.each do |provider| %>
|
23
|
-
<%= link_to "Sign in with #{provider
|
24
|
-
<% end
|
25
|
-
<% end
|
23
|
+
<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %><br />
|
24
|
+
<% end %>
|
25
|
+
<% end %>
|
@@ -1,12 +1,16 @@
|
|
1
1
|
<h2>Resend unlock instructions</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
|
-
<div
|
7
|
-
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
|
+
</div>
|
8
10
|
|
9
|
-
<div
|
11
|
+
<div class="actions">
|
12
|
+
<%= f.submit "Resend unlock instructions" %>
|
13
|
+
</div>
|
10
14
|
<% end %>
|
11
15
|
|
12
16
|
<%= render "devise/shared/links" %>
|
data/config/locales/en.yml
CHANGED
@@ -3,26 +3,30 @@
|
|
3
3
|
en:
|
4
4
|
devise:
|
5
5
|
confirmations:
|
6
|
-
confirmed: "Your
|
7
|
-
send_instructions: "You will receive an email with instructions
|
8
|
-
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions
|
6
|
+
confirmed: "Your email address has been successfully confirmed."
|
7
|
+
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
8
|
+
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
9
9
|
failure:
|
10
10
|
already_authenticated: "You are already signed in."
|
11
11
|
inactive: "Your account is not activated yet."
|
12
|
-
invalid: "Invalid
|
12
|
+
invalid: "Invalid %{authentication_keys} or password."
|
13
13
|
locked: "Your account is locked."
|
14
|
-
last_attempt: "You have one more attempt before your account
|
15
|
-
not_found_in_database: "Invalid
|
14
|
+
last_attempt: "You have one more attempt before your account is locked."
|
15
|
+
not_found_in_database: "Invalid %{authentication_keys} or password."
|
16
16
|
timeout: "Your session expired. Please sign in again to continue."
|
17
17
|
unauthenticated: "You need to sign in or sign up before continuing."
|
18
|
-
unconfirmed: "You have to confirm your
|
18
|
+
unconfirmed: "You have to confirm your email address before continuing."
|
19
19
|
mailer:
|
20
20
|
confirmation_instructions:
|
21
21
|
subject: "Confirmation instructions"
|
22
22
|
reset_password_instructions:
|
23
23
|
subject: "Reset password instructions"
|
24
24
|
unlock_instructions:
|
25
|
-
subject: "Unlock
|
25
|
+
subject: "Unlock instructions"
|
26
|
+
email_changed:
|
27
|
+
subject: "Email Changed"
|
28
|
+
password_change:
|
29
|
+
subject: "Password Changed"
|
26
30
|
omniauth_callbacks:
|
27
31
|
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
28
32
|
success: "Successfully authenticated from %{kind} account."
|
@@ -30,22 +34,24 @@ en:
|
|
30
34
|
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
31
35
|
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
32
36
|
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
33
|
-
updated: "Your password
|
34
|
-
updated_not_active: "Your password
|
37
|
+
updated: "Your password has been changed successfully. You are now signed in."
|
38
|
+
updated_not_active: "Your password has been changed successfully."
|
35
39
|
registrations:
|
36
|
-
destroyed: "Bye! Your account
|
40
|
+
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
37
41
|
signed_up: "Welcome! You have signed up successfully."
|
38
42
|
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
39
43
|
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
40
|
-
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please
|
41
|
-
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and
|
42
|
-
updated: "
|
44
|
+
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
45
|
+
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address."
|
46
|
+
updated: "Your account has been updated successfully."
|
47
|
+
updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again"
|
43
48
|
sessions:
|
44
49
|
signed_in: "Signed in successfully."
|
45
50
|
signed_out: "Signed out successfully."
|
51
|
+
already_signed_out: "Signed out successfully."
|
46
52
|
unlocks:
|
47
|
-
send_instructions: "You will receive an email with instructions
|
48
|
-
send_paranoid_instructions: "If your account exists, you will receive an email with instructions
|
53
|
+
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
54
|
+
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
49
55
|
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
50
56
|
errors:
|
51
57
|
messages:
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Devise
|
2
4
|
module Controllers
|
3
5
|
# Those helpers are convenience methods added to ApplicationController.
|
@@ -7,10 +9,76 @@ module Devise
|
|
7
9
|
include Devise::Controllers::StoreLocation
|
8
10
|
|
9
11
|
included do
|
10
|
-
|
12
|
+
if respond_to?(:helper_method)
|
13
|
+
helper_method :warden, :signed_in?, :devise_controller?
|
14
|
+
end
|
11
15
|
end
|
12
16
|
|
13
17
|
module ClassMethods
|
18
|
+
# Define authentication filters and accessor helpers for a group of mappings.
|
19
|
+
# These methods are useful when you are working with multiple mappings that
|
20
|
+
# share some functionality. They are pretty much the same as the ones
|
21
|
+
# defined for normal mappings.
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
#
|
25
|
+
# inside BlogsController (or any other controller, it doesn't matter which):
|
26
|
+
# devise_group :blogger, contains: [:user, :admin]
|
27
|
+
#
|
28
|
+
# Generated methods:
|
29
|
+
# authenticate_blogger! # Redirects unless user or admin are signed in
|
30
|
+
# blogger_signed_in? # Checks whether there is either a user or an admin signed in
|
31
|
+
# current_blogger # Currently signed in user or admin
|
32
|
+
# current_bloggers # Currently signed in user and admin
|
33
|
+
#
|
34
|
+
# Use:
|
35
|
+
# before_action :authenticate_blogger! # Redirects unless either a user or an admin are authenticated
|
36
|
+
# before_action ->{ authenticate_blogger! :admin } # Redirects to the admin login page
|
37
|
+
# current_blogger :user # Preferably returns a User if one is signed in
|
38
|
+
#
|
39
|
+
def devise_group(group_name, opts={})
|
40
|
+
mappings = "[#{ opts[:contains].map { |m| ":#{m}" }.join(',') }]"
|
41
|
+
|
42
|
+
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
43
|
+
def authenticate_#{group_name}!(favourite=nil, opts={})
|
44
|
+
unless #{group_name}_signed_in?
|
45
|
+
mappings = #{mappings}
|
46
|
+
mappings.unshift mappings.delete(favourite.to_sym) if favourite
|
47
|
+
mappings.each do |mapping|
|
48
|
+
opts[:scope] = mapping
|
49
|
+
warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def #{group_name}_signed_in?
|
55
|
+
#{mappings}.any? do |mapping|
|
56
|
+
warden.authenticate?(scope: mapping)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def current_#{group_name}(favourite=nil)
|
61
|
+
mappings = #{mappings}
|
62
|
+
mappings.unshift mappings.delete(favourite.to_sym) if favourite
|
63
|
+
mappings.each do |mapping|
|
64
|
+
current = warden.authenticate(scope: mapping)
|
65
|
+
return current if current
|
66
|
+
end
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def current_#{group_name.to_s.pluralize}
|
71
|
+
#{mappings}.map do |mapping|
|
72
|
+
warden.authenticate(scope: mapping)
|
73
|
+
end.compact
|
74
|
+
end
|
75
|
+
|
76
|
+
if respond_to?(:helper_method)
|
77
|
+
helper_method "current_#{group_name}", "current_#{group_name.to_s.pluralize}", "#{group_name}_signed_in?"
|
78
|
+
end
|
79
|
+
METHODS
|
80
|
+
end
|
81
|
+
|
14
82
|
def log_process_action(payload)
|
15
83
|
payload[:status] ||= 401 unless payload[:exception]
|
16
84
|
super
|
@@ -18,7 +86,7 @@ module Devise
|
|
18
86
|
end
|
19
87
|
|
20
88
|
# Define authentication filters and accessor helpers based on mappings.
|
21
|
-
# These filters should be used inside the controllers as
|
89
|
+
# These filters should be used inside the controllers as before_actions,
|
22
90
|
# so you can control the scope of the user who should be signed in to
|
23
91
|
# access that specific controller/action.
|
24
92
|
# Example:
|
@@ -38,8 +106,8 @@ module Devise
|
|
38
106
|
# admin_session # Session data available only to the admin scope
|
39
107
|
#
|
40
108
|
# Use:
|
41
|
-
#
|
42
|
-
#
|
109
|
+
# before_action :authenticate_user! # Tell devise to use :user map
|
110
|
+
# before_action :authenticate_admin! # Tell devise to use :admin map
|
43
111
|
#
|
44
112
|
def self.define_helpers(mapping) #:nodoc:
|
45
113
|
mapping = mapping.name
|
@@ -64,33 +132,31 @@ module Devise
|
|
64
132
|
METHODS
|
65
133
|
|
66
134
|
ActiveSupport.on_load(:action_controller) do
|
67
|
-
|
135
|
+
if respond_to?(:helper_method)
|
136
|
+
helper_method "current_#{mapping}", "#{mapping}_signed_in?", "#{mapping}_session"
|
137
|
+
end
|
68
138
|
end
|
69
139
|
end
|
70
140
|
|
71
141
|
# The main accessor for the warden proxy instance
|
72
142
|
def warden
|
73
|
-
request.env['warden']
|
143
|
+
request.env['warden'] or raise MissingWarden
|
74
144
|
end
|
75
145
|
|
76
146
|
# Return true if it's a devise_controller. false to all controllers unless
|
77
147
|
# the controllers defined inside devise. Useful if you want to apply a before
|
78
148
|
# filter to all controllers, except the ones in devise:
|
79
149
|
#
|
80
|
-
#
|
150
|
+
# before_action :my_filter, unless: :devise_controller?
|
81
151
|
def devise_controller?
|
82
152
|
is_a?(::DeviseController)
|
83
153
|
end
|
84
154
|
|
85
|
-
#
|
155
|
+
# Set up a param sanitizer to filter parameters using strong_parameters. See
|
86
156
|
# lib/devise/parameter_sanitizer.rb for more info. Override this
|
87
157
|
# method in your application controller to use your own parameter sanitizer.
|
88
158
|
def devise_parameter_sanitizer
|
89
|
-
@devise_parameter_sanitizer ||=
|
90
|
-
Devise::ParameterSanitizer.new(resource_class, resource_name, params)
|
91
|
-
else
|
92
|
-
Devise::BaseSanitizer.new(resource_class, resource_name, params)
|
93
|
-
end
|
159
|
+
@devise_parameter_sanitizer ||= Devise::ParameterSanitizer.new(resource_class, resource_name, params)
|
94
160
|
end
|
95
161
|
|
96
162
|
# Tell warden that params authentication is allowed for that specific page.
|
@@ -102,9 +168,16 @@ module Devise
|
|
102
168
|
# tries to find a resource_root_path, otherwise it uses the root_path.
|
103
169
|
def signed_in_root_path(resource_or_scope)
|
104
170
|
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
171
|
+
router_name = Devise.mappings[scope].router_name
|
172
|
+
|
105
173
|
home_path = "#{scope}_root_path"
|
106
|
-
|
107
|
-
|
174
|
+
|
175
|
+
context = router_name ? send(router_name) : self
|
176
|
+
|
177
|
+
if context.respond_to?(home_path, true)
|
178
|
+
context.send(home_path)
|
179
|
+
elsif context.respond_to?(:root_path)
|
180
|
+
context.root_path
|
108
181
|
elsif respond_to?(:root_path)
|
109
182
|
root_path
|
110
183
|
else
|
@@ -121,10 +194,10 @@ module Devise
|
|
121
194
|
# root path. For a user scope, you can define the default url in
|
122
195
|
# the following way:
|
123
196
|
#
|
124
|
-
#
|
197
|
+
# get '/users' => 'users#index', as: :user_root # creates user_root_path
|
125
198
|
#
|
126
|
-
#
|
127
|
-
#
|
199
|
+
# namespace :user do
|
200
|
+
# root 'users#index' # creates user_root_path
|
128
201
|
# end
|
129
202
|
#
|
130
203
|
# If the resource root path is not defined, root_path is used. However,
|
@@ -150,7 +223,10 @@ module Devise
|
|
150
223
|
#
|
151
224
|
# By default it is the root_path.
|
152
225
|
def after_sign_out_path_for(resource_or_scope)
|
153
|
-
|
226
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
227
|
+
router_name = Devise.mappings[scope].router_name
|
228
|
+
context = router_name ? send(router_name) : self
|
229
|
+
context.respond_to?(:root_path) ? context.root_path : "/"
|
154
230
|
end
|
155
231
|
|
156
232
|
# Sign in a user and tries to redirect first to the stored location and
|
@@ -176,10 +252,9 @@ module Devise
|
|
176
252
|
# Overwrite Rails' handle unverified request to sign out all scopes,
|
177
253
|
# clear run strategies and remove cached variables.
|
178
254
|
def handle_unverified_request
|
179
|
-
|
255
|
+
super # call the default behaviour which resets/nullifies/raises
|
180
256
|
request.env["devise.skip_storage"] = true
|
181
|
-
|
182
|
-
super # call the default behaviour which resets the session
|
257
|
+
sign_out_all_scopes(false)
|
183
258
|
end
|
184
259
|
|
185
260
|
def request_format
|
@@ -193,21 +268,26 @@ module Devise
|
|
193
268
|
# Check if flash messages should be emitted. Default is to do it on
|
194
269
|
# navigational formats
|
195
270
|
def is_flashing_format?
|
196
|
-
is_navigational_format?
|
271
|
+
request.respond_to?(:flash) && is_navigational_format?
|
197
272
|
end
|
198
273
|
|
199
274
|
private
|
200
275
|
|
201
|
-
def expire_session_data_after_sign_in!
|
202
|
-
ActiveSupport::Deprecation.warn "expire_session_data_after_sign_in! is deprecated " \
|
203
|
-
"in favor of expire_data_after_sign_in!"
|
204
|
-
expire_data_after_sign_in!
|
205
|
-
end
|
206
|
-
|
207
276
|
def expire_data_after_sign_out!
|
208
277
|
Devise.mappings.each { |_,m| instance_variable_set("@current_#{m.name}", nil) }
|
209
278
|
super
|
210
279
|
end
|
211
280
|
end
|
212
281
|
end
|
282
|
+
|
283
|
+
class MissingWarden < StandardError
|
284
|
+
def initialize
|
285
|
+
super "Devise could not find the `Warden::Proxy` instance on your request environment.\n" + \
|
286
|
+
"Make sure that your application is loading Devise and Warden as expected and that " + \
|
287
|
+
"the `Warden::Manager` middleware is present in your middleware stack.\n" + \
|
288
|
+
"If you are seeing this on one of your tests, ensure that your tests are either " + \
|
289
|
+
"executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` " + \
|
290
|
+
"module to inject the `request.env['warden']` object for you."
|
291
|
+
end
|
292
|
+
end
|
213
293
|
end
|
@@ -1,19 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Devise
|
2
4
|
module Controllers
|
3
5
|
# A module that may be optionally included in a controller in order
|
4
6
|
# to provide remember me behavior. Useful when signing in is done
|
5
|
-
# through a callback, like in
|
7
|
+
# through a callback, like in OmniAuth.
|
6
8
|
module Rememberable
|
7
9
|
# Return default cookie values retrieved from session options.
|
8
10
|
def self.cookie_values
|
9
11
|
Rails.configuration.session_options.slice(:path, :domain, :secure)
|
10
12
|
end
|
11
13
|
|
14
|
+
def remember_me_is_active?(resource)
|
15
|
+
return false unless resource.respond_to?(:remember_me)
|
16
|
+
scope = Devise::Mapping.find_scope!(resource)
|
17
|
+
_, token, generated_at = cookies.signed[remember_key(resource, scope)]
|
18
|
+
resource.remember_me?(token, generated_at)
|
19
|
+
end
|
20
|
+
|
12
21
|
# Remembers the given resource by setting up a cookie
|
13
22
|
def remember_me(resource)
|
14
|
-
return if env["devise.skip_storage"]
|
23
|
+
return if request.env["devise.skip_storage"]
|
15
24
|
scope = Devise::Mapping.find_scope!(resource)
|
16
|
-
resource.remember_me!
|
25
|
+
resource.remember_me!
|
17
26
|
cookies.signed[remember_key(resource, scope)] = remember_cookie_values(resource)
|
18
27
|
end
|
19
28
|
|