trek 0.1.23 → 0.1.24

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +4 -4
  3. data/app/components/trek/form/actions_component/actions_component.css +2 -2
  4. data/app/controllers/concerns/trek/authentication.rb +1 -1
  5. data/app/controllers/concerns/trek/localization.rb +1 -1
  6. data/app/helpers/trek/theme_helper.rb +2 -2
  7. data/app/models/concerns/trek/users/invitable.rb +2 -3
  8. data/config/locales/trek.en.yml +9 -6
  9. data/config/locales/trek.fr.yml +8 -5
  10. data/docs/.vitepress/config.mjs +5 -0
  11. data/lib/generators/trek/install/admin/user_password_resets_generator.rb +0 -4
  12. data/lib/generators/trek/install/admin/user_sessions_generator.rb +0 -7
  13. data/lib/generators/trek/install/admin/users_generator.rb +5 -1
  14. data/lib/generators/trek/install/authentication_generator.rb +62 -1
  15. data/lib/generators/trek/install/locales_generator.rb +10 -7
  16. data/lib/generators/trek/install/mailer_generator.rb +14 -9
  17. data/lib/generators/trek/install/user_generator.rb +27 -1
  18. data/lib/generators/trek/install_generator.rb +4 -4
  19. data/lib/generators/trek/templates/controllers/admin/base_controller.rb +1 -0
  20. data/lib/generators/trek/templates/controllers/admin/user_password_resets_controller.rb +23 -27
  21. data/lib/generators/trek/templates/controllers/admin/user_sessions_controller.rb +13 -20
  22. data/lib/generators/trek/templates/controllers/admin/users_controller.rb +6 -0
  23. data/lib/generators/trek/templates/controllers/concerns/trek/authentication.rb +62 -0
  24. data/lib/generators/trek/templates/layouts/admin.html.slim +1 -1
  25. data/lib/generators/trek/templates/mailers/admin/passwords_mailer.rb +13 -0
  26. data/lib/generators/trek/templates/mailers/admin_mailer.rb +10 -0
  27. data/lib/generators/trek/templates/migrations/create_users.rb.erb +11 -0
  28. data/lib/generators/trek/templates/migrations/user_sessions.rb.erb +11 -0
  29. data/lib/generators/trek/templates/migrations/users.rb.erb +2 -0
  30. data/lib/generators/trek/templates/models/current.rb +3 -0
  31. data/lib/generators/trek/templates/models/user.rb +2 -0
  32. data/lib/generators/trek/templates/models/user_session.rb +3 -0
  33. data/lib/generators/trek/templates/views/admin/pages/_form.html.slim +0 -14
  34. data/lib/generators/trek/templates/views/admin/passwords_mailer/reset.en.html.slim +10 -0
  35. data/lib/generators/trek/templates/views/{user_mailer/reset_password_email.en.text.erb → admin/passwords_mailer/reset.en.text.erb} +3 -1
  36. data/lib/generators/trek/templates/views/admin/passwords_mailer/reset.fr.html.slim +10 -0
  37. data/lib/generators/trek/templates/views/{user_mailer/reset_password_email.fr.text.erb → admin/passwords_mailer/reset.fr.text.erb} +4 -2
  38. data/lib/generators/trek/templates/views/admin/user_password_resets/edit.html.slim +7 -7
  39. data/lib/generators/trek/templates/views/admin/user_password_resets/new.html.slim +5 -2
  40. data/lib/generators/trek/templates/views/admin/user_sessions/new.html.slim +12 -3
  41. data/lib/generators/trek/templates/views/admin/users/show.html.slim +1 -1
  42. data/lib/generators/trek/templates/views/admin_mailer/invite.en.html.slim +8 -0
  43. data/lib/generators/trek/templates/views/{user_mailer/invite_email.en.text.erb → admin_mailer/invite.en.text.erb} +1 -1
  44. data/lib/generators/trek/templates/views/admin_mailer/invite.fr.html.slim +8 -0
  45. data/lib/generators/trek/templates/views/{user_mailer/invite_email.fr.text.erb → admin_mailer/invite.fr.text.erb} +1 -1
  46. data/lib/trek/version.rb +1 -1
  47. data/package.json +3 -2
  48. data/yarn.lock +1807 -2486
  49. metadata +17 -12
  50. data/app/models/trek/user_password_reset.rb +0 -12
  51. data/lib/generators/trek/templates/mailers/user_mailer.rb +0 -21
  52. data/lib/generators/trek/templates/views/user_mailer/invite_email.en.html.slim +0 -29
  53. data/lib/generators/trek/templates/views/user_mailer/invite_email.fr.html.slim +0 -29
  54. data/lib/generators/trek/templates/views/user_mailer/reset_password_email.en.html.slim +0 -7
  55. data/lib/generators/trek/templates/views/user_mailer/reset_password_email.fr.html.slim +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c441a015bd63b8e650c1f39c225b2a40f6a6beebeff6db95d295a84a2c22eae2
4
- data.tar.gz: 2f7543789a5cb718fdb9a69e6c6f4b9143164a525ea7d5620c5b8816e9d35e01
3
+ metadata.gz: ac23b0f2968a03be59d307c19c62632c761cde58846a324dddd3f745a2bc5e8d
4
+ data.tar.gz: 30b95227f9369edb137c5208e1b1a390e9fd56efaf6e75143020af418007b7b3
5
5
  SHA512:
6
- metadata.gz: 1086f69da18c67aa88915c9556c511bca3f30eb981d768078d7f962f8ebf340769be08b0b131f8e873544cd4a152b715a28d7baacabaf19993a685e1c090083c
7
- data.tar.gz: 8507af27451b4ed7445fe1748e00a246392631d20c2804f213826356fa898a8b29aaf77a716a64233470022e7817209fbd103fbaa98b8482335f59b1279a0f33
6
+ metadata.gz: d5572d3b2d99a149ae840b7b04643e10bece86e6664f6595349a596b116dc33f07cb988f197d6c8ffc0c47aff9511fcacb328224d7ec9b7590d8a7f9490ee9a5
7
+ data.tar.gz: 2ac6db32ec1818397cbfd1e321164861d4e1bd0078296a7d37fe71f1a54e92d20793c0c435818eafdbbb489240ec812c4e22dd8e41d201614587a8b08164ac32
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trek (0.1.23)
4
+ trek (0.1.24)
5
5
  action_policy (~> 0.6)
6
6
  actioncable
7
7
  acts_as_list (~> 1.1)
@@ -158,7 +158,7 @@ GEM
158
158
  activerecord (>= 7.2.0)
159
159
  with_advisory_lock (>= 7.0.0)
160
160
  zeitwerk (~> 2.7)
161
- concurrent-ruby (1.3.6)
161
+ concurrent-ruby (1.3.7)
162
162
  connection_pool (3.0.2)
163
163
  content_disposition (1.0.0)
164
164
  crass (1.0.6)
@@ -298,9 +298,9 @@ GEM
298
298
  net-smtp (0.5.1)
299
299
  net-protocol
300
300
  nio4r (2.7.5)
301
- nokogiri (1.19.3-arm64-darwin)
301
+ nokogiri (1.19.4-arm64-darwin)
302
302
  racc (~> 1.4)
303
- nokogiri (1.19.3-x86_64-darwin)
303
+ nokogiri (1.19.4-x86_64-darwin)
304
304
  racc (~> 1.4)
305
305
  parallel (1.27.0)
306
306
  parser (3.3.10.0)
@@ -7,9 +7,9 @@
7
7
  display: flex;
8
8
  max-width: 120rem;
9
9
  padding: 4rem 0;
10
- position: fixed;
10
+ position: sticky;
11
11
  width: 100%;
12
- z-index: 1;
12
+ z-index: 2;
13
13
  }
14
14
 
15
15
  .buttons {
@@ -11,7 +11,7 @@ module Trek
11
11
  private
12
12
 
13
13
  def current_attribute_user
14
- current_user
14
+ Current.user
15
15
  end
16
16
 
17
17
  def not_authenticated
@@ -22,7 +22,7 @@ module Trek
22
22
  end
23
23
 
24
24
  def locale_from_current_user
25
- current_user&.locale
25
+ Current.user&.locale
26
26
  end
27
27
 
28
28
  def locale_from_headers
@@ -1,8 +1,8 @@
1
1
  module Trek
2
2
  module ThemeHelper
3
3
  def class_for_theme
4
- if logged_in?
5
- "#{current_user.theme}-theme"
4
+ if authenticated?
5
+ "#{Current.user.theme}-theme"
6
6
  else
7
7
  "light-theme"
8
8
  end
@@ -4,7 +4,7 @@ module Trek
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- attr_accessor :send_invite
7
+ attribute :send_invite, :boolean
8
8
 
9
9
  after_create :send_invite_email, if: :send_invite
10
10
  end
@@ -12,8 +12,7 @@ module Trek
12
12
  private
13
13
 
14
14
  def send_invite_email
15
- generate_reset_password_token!
16
- UserMailer.invite_email(self).deliver_later
15
+ AdminMailer.invite(self).deliver_later
17
16
  end
18
17
  end
19
18
  end
@@ -149,17 +149,20 @@ en:
149
149
  success: Action added
150
150
  form:
151
151
  title: Action
152
+ passwords_mailer:
153
+ reset:
154
+ subject: Reset your password
152
155
  search_component:
153
156
  search: Search
154
157
  search_user: Search for a user with an email
155
158
  seo: SEO
156
159
  settings: Settings
157
160
  user_password_resets:
161
+ not_found: Invalid or expired password reset link.
158
162
  create:
159
163
  success: A password recovery email has been sent to you
160
164
  new:
161
165
  remembered_password: I found my password!
162
- title: Reset password
163
166
  update:
164
167
  success: Your password has been changed
165
168
  user_sessions:
@@ -170,7 +173,6 @@ en:
170
173
  success: You are now logged out
171
174
  new:
172
175
  forgot_password: I forgot my password
173
- title: Log in
174
176
  users:
175
177
  create:
176
178
  success: User added
@@ -248,8 +250,9 @@ en:
248
250
  auto: auto
249
251
  dark: dark
250
252
  light: light
251
- user_mailer:
252
- invite_email:
253
+ admin_mailer:
254
+ invite:
253
255
  subject: Your invitation
254
- reset_password_email:
255
- subject: Reset your password
256
+ notices:
257
+ authentication_needed: Please log in
258
+ rate_limited: Too many attempts, please try again later
@@ -157,11 +157,11 @@ fr:
157
157
  seo: SEO
158
158
  settings: Paramètres
159
159
  user_password_resets:
160
+ not_found: Lien de réinitialisation de mot de passe invalide ou expiré.
160
161
  create:
161
162
  success: Un e-mail de récupération de mot de passe vous a été envoyé
162
163
  new:
163
164
  remembered_password: J'ai retrouvé mon mot de passe !
164
- title: Mot de passe oublié
165
165
  update:
166
166
  success: Votre mot de passe a été modifié
167
167
  user_sessions:
@@ -172,7 +172,6 @@ fr:
172
172
  success: Vous êtes maintenant déconnecté·e
173
173
  new:
174
174
  forgot_password: J'ai oublié mon mot de passe
175
- title: Connexion
176
175
  users:
177
176
  create:
178
177
  success: Utilisateur ajouté
@@ -250,8 +249,12 @@ fr:
250
249
  auto: auto
251
250
  dark: sombre
252
251
  light: clair
253
- user_mailer:
254
- invite_email:
252
+ admin_mailer:
253
+ invite:
255
254
  subject: Votre invitation
256
- reset_password_email:
255
+ passwords_mailer:
256
+ reset:
257
257
  subject: Nouveau mot de passe
258
+ notices:
259
+ authentication_needed: Veuillez vous connecter
260
+ rate_limited: Trop de tentatives, veuillez réessayer plus tard
@@ -1,7 +1,12 @@
1
1
  import { defineConfig } from 'vitepress'
2
+ import llmstxt from 'vitepress-plugin-llms'
3
+
2
4
 
3
5
  // https://vitepress.dev/reference/site-config
4
6
  export default defineConfig({
7
+ vite: {
8
+ plugins: [llmstxt()],
9
+ },
5
10
  title: "Trek",
6
11
  description: "A modern content management & back-office system for Ruby on Rails",
7
12
  lang: 'en-US',
@@ -12,10 +12,6 @@ module Trek
12
12
 
13
13
  source_root File.expand_path("../../templates", __dir__)
14
14
 
15
- def add_routes
16
- route "resources :user_password_resets, only: %i[new create edit update]", namespace: :admin
17
- end
18
-
19
15
  def copy_controller
20
16
  template "controllers/admin/user_password_resets_controller.rb",
21
17
  "app/controllers/admin/user_password_resets_controller.rb"
@@ -12,13 +12,6 @@ module Trek
12
12
 
13
13
  source_root File.expand_path("../../templates", __dir__)
14
14
 
15
- def add_routes
16
- route "resources :user_sessions, only: %i[new create destroy]", namespace: :admin
17
-
18
- route 'get :login, to: "user_sessions#new", as: :login', namespace: :admin
19
- route 'delete :logout, to: "user_sessions#destroy", as: :logout', namespace: :admin
20
- end
21
-
22
15
  def copy_controller
23
16
  template "controllers/admin/user_sessions_controller.rb",
24
17
  "app/controllers/admin/user_sessions_controller.rb"
@@ -13,7 +13,11 @@ module Trek
13
13
  source_root File.expand_path("../../templates", __dir__)
14
14
 
15
15
  def add_routes
16
- route "resources :users", namespace: :admin
16
+ route <<~RUBY, namespace: :admin
17
+ resources :users do
18
+ patch :theme, on: :collection
19
+ end
20
+ RUBY
17
21
  end
18
22
 
19
23
  def copy_controller
@@ -6,13 +6,74 @@ module Trek
6
6
  module Generators
7
7
  module Install
8
8
  class AuthenticationGenerator < Rails::Generators::Base
9
+ USER_MODEL_CLASS_NAME = "User".freeze
10
+
11
+ include Rails::Generators::Migration
9
12
  include Trek::Generators::Helpers
10
13
 
11
14
  desc "Setup authentication."
12
15
 
13
16
  source_root File.expand_path("../templates", __dir__)
14
17
 
15
- # TODO
18
+ def add_bcrypt_gem
19
+ gem "bcrypt", "~> 3.1.7" unless in_gemfile?("bcrypt")
20
+ run "bundle install --quiet", abort_on_failure: true
21
+ end
22
+
23
+ def copy_admin_authentication_concern
24
+ template "controllers/concerns/trek/authentication.rb",
25
+ "app/controllers/concerns/trek/authentication.rb"
26
+ end
27
+
28
+ def copy_user_session_model
29
+ template "models/user_session.rb",
30
+ "app/models/user_session.rb"
31
+ end
32
+
33
+ def copy_user_sessions_migration
34
+ return unless defined?(ActiveRecord)
35
+
36
+ migration_template("migrations/user_sessions.rb.erb",
37
+ "db/migrate/trek_user_sessions.rb",
38
+ migration_class_name:)
39
+ end
40
+
41
+ def inject_authentication_into_user_model
42
+ inject_into_class user_model_path,
43
+ USER_MODEL_CLASS_NAME,
44
+ user_model_injection
45
+ end
46
+
47
+ def add_admin_auth_routes
48
+ route "resource :user_session, only: %i[new create destroy]", namespace: :admin
49
+ route "resources :user_password_resets, param: :token, only: %i[new create edit update]", namespace: :admin
50
+ route 'get :login, to: "user_sessions#new", as: :login', namespace: :admin
51
+ route 'delete :logout, to: "user_sessions#destroy", as: :logout', namespace: :admin
52
+ end
53
+
54
+ def autocorrect_user_model
55
+ run "rubocop --autocorrect #{user_model_path}"
56
+ end
57
+
58
+ private
59
+
60
+ def user_model_path
61
+ @user_model_path ||= File.join("app", "models", "#{USER_MODEL_CLASS_NAME.underscore}.rb")
62
+ end
63
+
64
+ def user_model_injection
65
+ <<-RUBY
66
+ has_secure_password
67
+ has_many :user_sessions, dependent: :destroy
68
+
69
+ generates_token_for :password_reset, expires_in: 15.minutes do
70
+ password_salt&.last(10)
71
+ end
72
+
73
+ scope :privileged, -> { where(role: Trek::Users::Roles::PRIVILEGED_ROLES) }
74
+
75
+ RUBY
76
+ end
16
77
  end
17
78
  end
18
79
  end
@@ -12,16 +12,19 @@ module Trek
12
12
 
13
13
  source_root File.expand_path("../templates", __dir__)
14
14
 
15
- def ask_locales
16
- loop do
17
- @locales = ENV["TREK_LOCALES"] || ask("What locales do you want to use? (e.g. en, fr)")
15
+ class_option :locales, type: :string,
16
+ desc: "Comma-separated locales to enable, e.g. en,fr (default: en)"
18
17
 
19
- break if valid_locales?(@locales)
18
+ def set_locales
19
+ raw = options[:locales] || ENV["TREK_LOCALES"] || "en"
20
+ @locales = raw.split(",").map(&:strip)
20
21
 
21
- Rails.logger.debug "Invalid locales entered."
22
- end
22
+ invalid = @locales.reject { |locale| valid_locales?(locale) }
23
+ return if invalid.empty?
23
24
 
24
- @locales = @locales.split(",").map(&:strip)
25
+ say "Ignoring unavailable locales: #{invalid.join(", ")}", :yellow
26
+ @locales -= invalid
27
+ @locales = ["en"] if @locales.empty?
25
28
  end
26
29
 
27
30
  def create_locales_initializer
@@ -19,25 +19,30 @@ module Trek
19
19
  "app/views/layouts/mailer.html.slim"
20
20
  end
21
21
 
22
- def user_mailer
23
- template "mailers/user_mailer.rb",
24
- "app/mailers/user_mailer.rb"
22
+ def admin_mailer
23
+ template "mailers/admin_mailer.rb",
24
+ "app/mailers/admin_mailer.rb"
25
25
  end
26
26
 
27
- def copy_views_invite_email_user_mailer
27
+ def passwords_mailer
28
+ template "mailers/admin/passwords_mailer.rb",
29
+ "app/mailers/admin/passwords_mailer.rb"
30
+ end
31
+
32
+ def copy_views_admin_mailer_invite
28
33
  extensions.each do |extension|
29
34
  locales.each do |lang|
30
- template "views/user_mailer/invite_email.#{lang}#{extension}",
31
- "app/views/user_mailer/invite_email.#{lang}#{extension}"
35
+ template "views/admin_mailer/invite.#{lang}#{extension}",
36
+ "app/views/admin_mailer/invite.#{lang}#{extension}"
32
37
  end
33
38
  end
34
39
  end
35
40
 
36
- def copy_views_reset_password_user_mailer
41
+ def copy_views_passwords_mailer_reset
37
42
  extensions.each do |extension|
38
43
  locales.each do |lang|
39
- template "views/user_mailer/reset_password_email.#{lang}#{extension}",
40
- "app/views/user_mailer/reset_password_email.#{lang}#{extension}"
44
+ template "views/admin/passwords_mailer/reset.#{lang}#{extension}",
45
+ "app/views/admin/passwords_mailer/reset.#{lang}#{extension}"
41
46
  end
42
47
  end
43
48
  end
@@ -15,11 +15,25 @@ module Trek
15
15
 
16
16
  source_root File.expand_path("../templates", __dir__)
17
17
 
18
+ def create_user_model
19
+ return if user_model_existed?
20
+
21
+ template "models/user.rb", user_model_path
22
+ end
23
+
24
+ def create_users_migration
25
+ return unless defined?(ActiveRecord)
26
+ return if user_model_existed?
27
+
28
+ migration_template("migrations/create_users.rb.erb",
29
+ "db/migrate/trek_create_users.rb",
30
+ migration_class_name:)
31
+ end
32
+
18
33
  def inject_trek_to_user_model
19
34
  inject_into_class user_model_path,
20
35
  USER_MODEL_CLASS_NAME,
21
36
  user_model_injection
22
- run "rubocop --autocorrect #{user_model_path}", abort_on_failure: true
23
37
  end
24
38
 
25
39
  def copy_migration_files
@@ -30,12 +44,24 @@ module Trek
30
44
  migration_class_name:)
31
45
  end
32
46
 
47
+ def autocorrect_user_model
48
+ run "rubocop --autocorrect #{user_model_path}"
49
+ end
50
+
33
51
  private
34
52
 
35
53
  def tableized_model_class
36
54
  USER_MODEL_CLASS_NAME.gsub("::", "").tableize
37
55
  end
38
56
 
57
+ # Memoizes whether the User model existed *before* this generator ran, so the
58
+ # value stays stable after `create_user_model` writes the file.
59
+ def user_model_existed?
60
+ return @user_model_existed unless @user_model_existed.nil?
61
+
62
+ @user_model_existed = File.exist?(user_model_path)
63
+ end
64
+
39
65
  def user_model_path
40
66
  @user_model_path ||= File.join("app", "models", "#{user_file_path}.rb")
41
67
  end
@@ -72,6 +72,10 @@ module Trek
72
72
  generate "trek:install:mailer"
73
73
  end
74
74
 
75
+ def install_user
76
+ generate "trek:install:user"
77
+ end
78
+
75
79
  def install_authentication
76
80
  generate "trek:install:authentication"
77
81
  end
@@ -84,10 +88,6 @@ module Trek
84
88
  generate "trek:install:healthcheck"
85
89
  end
86
90
 
87
- def install_user
88
- generate "trek:install:user"
89
- end
90
-
91
91
  def install_translations
92
92
  generate "trek:install:translations"
93
93
  end
@@ -6,6 +6,7 @@ module Admin
6
6
 
7
7
  helper Trek::I18nHelper
8
8
  helper Trek::ThemeHelper
9
+ helper ApplicationHelper
9
10
 
10
11
  layout "admin"
11
12
 
@@ -2,9 +2,10 @@ module Admin
2
2
  class UserPasswordResetsController < ApplicationController
3
3
  include Trek::Authentication
4
4
 
5
- skip_before_action :require_login
6
- before_action :set_user, only: %i[edit update]
7
- before_action :redirect_if_logged_in
5
+ allow_unauthenticated_access
6
+ before_action :set_token, only: %i[edit update]
7
+ before_action :set_user_by_token, only: %i[edit update]
8
+ rate_limit to: 5, within: 3.minutes, only: :create, with: -> { redirect_to new_admin_user_session_path, alert: t("notices.rate_limited") }
8
9
 
9
10
  helper Trek::I18nHelper
10
11
  helper Trek::ThemeHelper
@@ -14,44 +15,39 @@ module Admin
14
15
  default_form_builder Trek::FormBuilder
15
16
 
16
17
  def new
17
- @user_password_reset = Trek::UserPasswordReset.new
18
- end
19
-
20
- def edit
21
18
  end
22
19
 
23
20
  def create
24
- @user_password_reset = Trek::UserPasswordReset.new(user_password_reset_params)
21
+ if user = User.privileged.find_by(email: params[:email])
22
+ Admin::PasswordsMailer.reset(user).deliver_later
23
+ end
25
24
 
26
- @user = @user_password_reset.user
27
- @user&.deliver_reset_password_instructions!
25
+ redirect_to new_admin_user_session_path, notice: t(".success")
26
+ end
28
27
 
29
- redirect_to(%i[admin login], notice: t(".success"))
28
+ def edit
30
29
  end
31
30
 
32
31
  def update
33
- if @user.change_password(params[:user][:new_password])
34
- redirect_to(%i[admin login], notice: t(".success"))
35
- else
36
- render action: "edit"
37
- end
32
+ @user.update!(params.permit(:password))
33
+ @user.user_sessions.destroy_all
34
+ redirect_to new_admin_user_session_path, notice: t(".success")
35
+ rescue ActiveRecord::RecordInvalid
36
+ redirect_to edit_admin_user_password_reset_path(@token), alert: @user.errors.full_messages.join(", ")
38
37
  end
39
38
 
40
39
  private
41
40
 
42
- def set_user
43
- @token = params[:id]
44
- @user = User.load_from_reset_password_token(params[:id])
45
-
46
- not_authenticated if @user.blank?
47
- end
48
-
49
- def user_password_reset_params
50
- params.require(:user_password_reset).permit(:email)
41
+ def set_token
42
+ @token = params[:token]
51
43
  end
52
44
 
53
- def redirect_if_logged_in
54
- redirect_to %i[admin root] if logged_in?
45
+ def set_user_by_token
46
+ @user = User.privileged.find_by_token_for!(:password_reset, @token)
47
+ rescue ActiveRecord::RecordNotFound
48
+ redirect_to new_admin_user_session_path, alert: t("admin.user_password_resets.not_found")
49
+ rescue ActiveSupport::MessageVerifier::InvalidSignature
50
+ redirect_to new_admin_user_password_reset_path, alert: t("admin.user_password_resets.not_found")
55
51
  end
56
52
  end
57
53
  end
@@ -2,8 +2,8 @@ module Admin
2
2
  class UserSessionsController < ApplicationController
3
3
  include Trek::Authentication
4
4
 
5
- before_action :redirect_if_logged_in, only: %i[new create]
6
- skip_before_action :require_login, except: :destroy
5
+ allow_unauthenticated_access only: %i[new create]
6
+ rate_limit to: 5, within: 3.minutes, only: :create, with: -> { redirect_to new_admin_user_session_path, alert: t("notices.rate_limited") }
7
7
 
8
8
  helper Trek::I18nHelper
9
9
  helper Trek::ThemeHelper
@@ -13,36 +13,29 @@ module Admin
13
13
  default_form_builder Trek::FormBuilder
14
14
 
15
15
  def new
16
- @user_session = Trek::UserSession.new
17
- @user = User.new
16
+ return redirect_to after_authentication_url if authenticated?
17
+
18
+ @email = params[:email].presence
18
19
  end
19
20
 
20
21
  def create
21
- @user_session = Trek::UserSession.new(user_session_params)
22
- @user = login(@user_session.email, @user_session.password)
23
-
24
- if @user&.privileged?
25
- @user.remember_me!
26
- redirect_back_or_to %i[admin root], notice: t(".success")
22
+ if user = User.privileged.authenticate_by(session_params)
23
+ start_new_session_for user
24
+ redirect_to after_authentication_url, notice: t(".success")
27
25
  else
28
- logout
29
- redirect_back_or_to %i[admin login], alert: t(".failure")
26
+ redirect_to new_admin_user_session_path, alert: t(".failure")
30
27
  end
31
28
  end
32
29
 
33
30
  def destroy
34
- logout
35
- redirect_to %i[admin login], notice: t(".success")
31
+ terminate_session
32
+ redirect_to new_admin_user_session_path, notice: t(".success"), status: :see_other
36
33
  end
37
34
 
38
35
  private
39
36
 
40
- def user_session_params
41
- params.require(:user_session).permit(:email, :password)
42
- end
43
-
44
- def redirect_if_logged_in
45
- redirect_to %i[admin root] if logged_in?
37
+ def session_params
38
+ params.permit(:email, :password)
46
39
  end
47
40
  end
48
41
  end
@@ -5,6 +5,12 @@ module Admin
5
5
  @object.role = "editor"
6
6
  end
7
7
 
8
+ def theme
9
+ value = params[:theme].to_s
10
+ Current.user.update!(theme: value) if User.themes.key?(value)
11
+ head :no_content
12
+ end
13
+
8
14
  private
9
15
 
10
16
  def model