pages_core 3.6.2 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/Rakefile +3 -1
  4. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +1 -1
  5. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +5 -5
  6. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +10 -5
  7. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +10 -5
  8. data/app/assets/javascripts/pages/admin/components/page_tree.jsx +9 -9
  9. data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +11 -11
  10. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +5 -4
  11. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +54 -21
  12. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -3
  13. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +1 -1
  14. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +3 -3
  15. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +1 -1
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +28 -28
  17. data/app/assets/javascripts/pages/admin/lib/tree.jsx +9 -9
  18. data/app/assets/javascripts/pages/login_form.jsx +8 -8
  19. data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
  20. data/app/assets/stylesheets/pages/errors.css +2 -0
  21. data/app/controller_dummies/admin/admin_controller.rb +2 -0
  22. data/app/controller_dummies/application_controller.rb +2 -0
  23. data/app/controller_dummies/attachments_controller.rb +2 -0
  24. data/app/controller_dummies/frontend_controller.rb +2 -0
  25. data/app/controller_dummies/images_controller.rb +2 -0
  26. data/app/controller_dummies/page_files_controller.rb +2 -0
  27. data/app/controller_dummies/pages_controller.rb +2 -0
  28. data/app/controller_dummies/sitemaps_controller.rb +2 -0
  29. data/app/controllers/admin/attachments_controller.rb +4 -2
  30. data/app/controllers/admin/categories_controller.rb +2 -0
  31. data/app/controllers/admin/images_controller.rb +10 -5
  32. data/app/controllers/admin/invites_controller.rb +4 -1
  33. data/app/controllers/admin/pages_controller.rb +7 -19
  34. data/app/controllers/admin/password_resets_controller.rb +9 -5
  35. data/app/controllers/admin/users_controller.rb +10 -4
  36. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
  37. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  38. data/app/controllers/concerns/pages_core/authentication.rb +4 -1
  39. data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
  40. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  41. data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
  42. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -0
  43. data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
  44. data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
  45. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  46. data/app/controllers/errors_controller.rb +5 -53
  47. data/app/controllers/pages_core/admin_controller.rb +7 -67
  48. data/app/controllers/pages_core/attachments_controller.rb +10 -6
  49. data/app/controllers/pages_core/base_controller.rb +11 -17
  50. data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
  51. data/app/controllers/pages_core/frontend/pages_controller.rb +9 -15
  52. data/app/controllers/pages_core/frontend_controller.rb +3 -0
  53. data/app/controllers/pages_core/images_controller.rb +3 -1
  54. data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
  55. data/app/controllers/sessions_controller.rb +2 -0
  56. data/app/formatters/pages_core/html_formatter.rb +13 -63
  57. data/app/formatters/pages_core/image_embedder.rb +79 -0
  58. data/app/formatters/pages_core/link_renderer.rb +2 -0
  59. data/app/helpers/admin/admin_helper.rb +2 -0
  60. data/app/helpers/admin/menu_helper.rb +6 -4
  61. data/app/helpers/admin/pages_helper.rb +4 -57
  62. data/app/helpers/application_helper.rb +2 -0
  63. data/app/helpers/frontend_helper.rb +2 -0
  64. data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
  65. data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
  66. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  67. data/app/helpers/pages_core/admin/form_builder.rb +8 -0
  68. data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
  69. data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
  70. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  71. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  72. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  73. data/app/helpers/pages_core/application_helper.rb +3 -0
  74. data/app/helpers/pages_core/attachments_helper.rb +31 -27
  75. data/app/helpers/pages_core/form_builder.rb +17 -13
  76. data/app/helpers/pages_core/frontend_helper.rb +3 -3
  77. data/app/helpers/pages_core/head_tags_helper.rb +7 -2
  78. data/app/helpers/pages_core/images_helper.rb +3 -0
  79. data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
  80. data/app/helpers/pages_core/open_graph_tags_helper.rb +7 -5
  81. data/app/helpers/pages_core/page_path_helper.rb +24 -3
  82. data/app/jobs/pages_core/autopublish_job.rb +3 -1
  83. data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
  84. data/app/mailers/admin_mailer.rb +4 -14
  85. data/app/models/attachment.rb +10 -8
  86. data/app/models/autopublisher.rb +3 -0
  87. data/app/models/category.rb +3 -1
  88. data/app/models/concerns/pages_core/has_roles.rb +2 -0
  89. data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
  90. data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
  91. data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
  92. data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
  93. data/app/models/concerns/pages_core/page_model/images.rb +5 -1
  94. data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
  95. data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
  96. data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
  97. data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
  98. data/app/models/concerns/pages_core/page_model/status.rb +2 -0
  99. data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
  100. data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
  101. data/app/models/concerns/pages_core/sweepable.rb +4 -2
  102. data/app/models/concerns/pages_core/taggable.rb +8 -2
  103. data/app/models/image.rb +14 -1
  104. data/app/models/invite.rb +3 -1
  105. data/app/models/invite_role.rb +5 -3
  106. data/app/models/page.rb +4 -3
  107. data/app/models/page_builder.rb +2 -0
  108. data/app/models/page_category.rb +3 -1
  109. data/app/models/page_exporter.rb +22 -9
  110. data/app/models/page_file.rb +3 -1
  111. data/app/models/page_image.rb +3 -1
  112. data/app/models/page_path.rb +13 -5
  113. data/app/models/password_reset_token.rb +3 -1
  114. data/app/models/role.rb +8 -5
  115. data/app/models/tag.rb +8 -6
  116. data/app/models/tagging.rb +4 -2
  117. data/app/models/user.rb +7 -4
  118. data/app/policies/invite_policy.rb +2 -0
  119. data/app/policies/page_file_policy.rb +2 -0
  120. data/app/policies/page_image_policy.rb +2 -0
  121. data/app/policies/page_policy.rb +2 -0
  122. data/app/policies/policy.rb +2 -0
  123. data/app/policies/user_policy.rb +2 -0
  124. data/app/serializers/admin/attachment_serializer.rb +4 -2
  125. data/app/serializers/admin/image_serializer.rb +4 -2
  126. data/app/serializers/admin/page_file_serializer.rb +2 -0
  127. data/app/serializers/admin/page_image_serializer.rb +2 -0
  128. data/app/serializers/page_export_serializer.rb +2 -0
  129. data/app/serializers/page_file_export_serializer.rb +2 -0
  130. data/app/serializers/page_image_export_serializer.rb +2 -0
  131. data/app/serializers/page_image_serializer.rb +2 -0
  132. data/app/serializers/page_serializer.rb +2 -0
  133. data/app/services/pages_core/create_user_service.rb +5 -2
  134. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  135. data/app/services/pages_core/invite_service.rb +2 -0
  136. data/app/views/admin/images/show.json.jbuilder +2 -0
  137. data/app/views/admin/pages/news.html.erb +1 -1
  138. data/app/views/errors/500.html.erb +2 -20
  139. data/app/views/errors/_generic_help.html.erb +1 -1
  140. data/app/views/feeds/pages.rss.builder +2 -0
  141. data/app/views/sitemaps/show.xml.builder +2 -0
  142. data/config/routes.rb +5 -5
  143. data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
  144. data/lib/pages_core.rb +10 -0
  145. data/lib/pages_core/admin_menu_item.rb +3 -0
  146. data/lib/pages_core/archive_finder.rb +12 -16
  147. data/lib/pages_core/attachment_embedder.rb +4 -6
  148. data/lib/pages_core/cache_sweeper.rb +10 -108
  149. data/lib/pages_core/configuration.rb +2 -0
  150. data/lib/pages_core/configuration/base.rb +5 -0
  151. data/lib/pages_core/configuration/pages.rb +4 -2
  152. data/lib/pages_core/digest_verifier.rb +5 -5
  153. data/lib/pages_core/engine.rb +52 -0
  154. data/lib/pages_core/extensions.rb +2 -0
  155. data/lib/pages_core/extensions/string_extensions.rb +3 -1
  156. data/lib/pages_core/page_path_constraint.rb +2 -0
  157. data/lib/pages_core/pages_plugin.rb +3 -1
  158. data/lib/pages_core/plugin.rb +4 -52
  159. data/lib/pages_core/pub_sub.rb +2 -0
  160. data/lib/pages_core/static_cache.rb +26 -0
  161. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  162. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  163. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  164. data/lib/pages_core/templates.rb +5 -3
  165. data/lib/pages_core/templates/block_configuration.rb +3 -0
  166. data/lib/pages_core/templates/configuration.rb +5 -1
  167. data/lib/pages_core/templates/configuration_handler.rb +4 -2
  168. data/lib/pages_core/templates/configuration_proxy.rb +2 -0
  169. data/lib/pages_core/templates/controller_actions.rb +2 -0
  170. data/lib/pages_core/templates/template_configuration.rb +18 -13
  171. data/lib/pages_core/version.rb +3 -1
  172. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -0
  173. data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
  174. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  175. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
  176. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
  177. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  178. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
  179. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
  180. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
  181. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  182. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -0
  183. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
  184. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
  185. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
  186. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  187. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  188. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  189. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  190. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
  191. data/lib/tasks/pages.rake +3 -2
  192. data/lib/tasks/pages/cache.rake +8 -5
  193. data/lib/tasks/pages/export.rake +3 -1
  194. data/lib/tasks/pages/page_paths.rake +2 -0
  195. data/template.rb +2 -0
  196. metadata +127 -77
  197. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
  198. data/app/views/admin_mailer/error_report.html.erb +0 -70
  199. data/app/views/errors/500_critical.html.erb +0 -7
  200. data/app/views/errors/report.html.erb +0 -4
  201. data/config/removed_migrations.yml +0 -60
  202. data/db/migrate/20120627033112_rename_textbits.rb +0 -17
  203. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
  204. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
  205. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
  206. data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
  207. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
  208. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
  209. data/db/migrate/20140203183900_create_roles.rb +0 -66
  210. data/db/migrate/20140414150500_change_locale_names.rb +0 -11
  211. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  212. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
  213. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  214. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  215. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  216. data/db/migrate/20141007173000_create_invites.rb +0 -16
  217. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  218. data/db/migrate/20150401131300_localize_images.rb +0 -38
  219. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  220. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  221. data/db/migrate/20151002174800_create_page_paths.rb +0 -10
  222. data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
  223. data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
  224. data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
  225. data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
  226. data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
  227. data/db/migrate/20170716213400_remove_sessions.rb +0 -15
  228. data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
  229. data/db/migrate/20190211154800_create_attachments.rb +0 -73
  230. data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
  231. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
  232. data/lib/tasks/pages/update.rake +0 -17
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin
2
4
  class PasswordResetsController < Admin::AdminController
3
5
  before_action :find_password_reset_token, only: %i[show update]
@@ -42,11 +44,12 @@ module Admin
42
44
  admin_password_reset_with_token_url(
43
45
  password_reset, password_reset.token
44
46
  )
45
- ).deliver_now
47
+ ).deliver_later
46
48
  end
47
49
 
48
50
  def find_user_by_email(email)
49
51
  return unless email
52
+
50
53
  User.login_name(params[:username])
51
54
  end
52
55
 
@@ -60,10 +63,10 @@ module Admin
60
63
 
61
64
  def find_password_reset_token
62
65
  @password_reset_token = begin
63
- PasswordResetToken.find(params[:id])
64
- rescue ActiveRecord::RecordNotFound
65
- nil
66
- end
66
+ PasswordResetToken.find(params[:id])
67
+ rescue ActiveRecord::RecordNotFound
68
+ nil
69
+ end
67
70
 
68
71
  return if valid_token?(@password_reset_token)
69
72
 
@@ -73,6 +76,7 @@ module Admin
73
76
 
74
77
  def check_for_expired_token
75
78
  return unless @password_reset_token.expired?
79
+
76
80
  @password_reset_token.destroy
77
81
  flash[:notice] = "Your password reset link has expired"
78
82
  redirect_to(login_admin_users_url)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin
2
4
  class UsersController < Admin::AdminController
3
5
  before_action :require_authentication, except: %i[new create login]
@@ -19,6 +21,7 @@ module Admin
19
21
 
20
22
  def login
21
23
  return unless logged_in?
24
+
22
25
  redirect_to admin_default_url
23
26
  end
24
27
 
@@ -72,10 +75,11 @@ module Admin
72
75
  end
73
76
 
74
77
  def user_params
75
- permitted_params = %i[
76
- name email image image_id
77
- ]
78
- permitted_params += [:activated, role_names: []] if policy(User).manage?
78
+ permitted_params = %i[name email image image_id]
79
+ if policy(User).manage?
80
+ permitted_params += [:activated,
81
+ { role_names: [] }]
82
+ end
79
83
  if User.none? || (@user && policy(@user).change_password?)
80
84
  permitted_params += %i[password confirm_password]
81
85
  end
@@ -84,11 +88,13 @@ module Admin
84
88
 
85
89
  def user_params_with_roles
86
90
  return user_params unless policy(User).manage?
91
+
87
92
  { role_names: [] }.merge(user_params)
88
93
  end
89
94
 
90
95
  def require_no_users
91
96
  return unless User.any?
97
+
92
98
  flash[:error] = "Account holder already exists"
93
99
  redirect_to(admin_users_url)
94
100
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Admin
3
5
  module NewsPageController
@@ -6,26 +8,19 @@ module PagesCore
6
8
  included do
7
9
  before_action :require_news_pages, only: [:news]
8
10
  before_action :find_news_pages, only: %i[news new_news]
11
+ before_action :find_year_and_month, only: %i[news]
9
12
  end
10
13
 
11
14
  def news
12
15
  @archive_finder = archive_finder(@news_pages, @locale)
13
-
14
- unless params[:year]
16
+ unless @year
15
17
  redirect_to(news_admin_pages_path(@locale,
16
18
  (@archive_finder.latest_year ||
17
19
  Time.zone.now.year)))
18
20
  return
19
21
  end
20
-
21
- @year = params[:year]&.to_i
22
- @month = params[:month]&.to_i
23
-
24
- @pages = (if @month
25
- @archive_finder.by_year_and_month(@year, @month)
26
- else
27
- @archive_finder.by_year(@year)
28
- end).paginate(per_page: 50, page: params[:page])
22
+ @pages = @archive_finder.by_year_and_maybe_month(@year, @month)
23
+ .paginate(per_page: 50, page: params[:page])
29
24
  end
30
25
 
31
26
  def new_news
@@ -48,12 +43,19 @@ module PagesCore
48
43
  .in_locale(@locale)
49
44
  .reorder("parent_page_id ASC, position ASC")
50
45
  return if @news_pages.any?
46
+
51
47
  redirect_to(admin_pages_url(@locale))
52
48
  end
53
49
 
50
+ def find_year_and_month
51
+ @year = params[:year]&.to_i
52
+ @month = params[:month]&.to_i
53
+ end
54
+
54
55
  # Redirect away if no news pages has been configured
55
56
  def require_news_pages
56
57
  return if Page.news_pages.any?
58
+
57
59
  redirect_to(admin_pages_url(@locale))
58
60
  end
59
61
 
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module PersistentParams
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ before_action :restore_persistent_params
10
+ after_action :save_persistent_params
11
+ end
12
+
13
+ protected
14
+
15
+ # Loads persistent params from user model and merges with session.
16
+ def restore_persistent_params
17
+ return unless current_user&.persistent_data?
18
+
19
+ session[:persistent_params] ||= {}
20
+ session[:persistent_params] = current_user.persistent_data.merge(
21
+ session[:persistent_params]
22
+ )
23
+ end
24
+
25
+ # Saves persistent params from session to User model if applicable.
26
+ def save_persistent_params
27
+ return unless current_user && session[:persistent_params]
28
+
29
+ current_user.persistent_data = session[:persistent_params]
30
+ current_user.save
31
+ end
32
+
33
+ def persistent_params(namespace)
34
+ session[:persistent_params] ||= {}
35
+ session[:persistent_params][namespace] ||= {}
36
+ session[:persistent_params][namespace]
37
+ end
38
+
39
+ def coerce_persistent_param(value)
40
+ case value
41
+ when "true"
42
+ true
43
+ when "false"
44
+ false
45
+ else
46
+ value
47
+ end
48
+ end
49
+
50
+ def get_persistent_param(namespace, key, default)
51
+ if params.key?(key)
52
+ params[key]
53
+ elsif persistent_params(namespace).key?(key)
54
+ persistent_params(namespace)[key]
55
+ else
56
+ default
57
+ end
58
+ end
59
+
60
+ # Get a persistent param
61
+ def persistent_param(key, default = nil, options = {})
62
+ key = key.to_s
63
+ namespace = options[:namespace] || self.class.to_s
64
+
65
+ value = coerce_persistent_param(
66
+ get_persistent_param(namespace, key, default)
67
+ )
68
+
69
+ persistent_params(namespace)[key] = value unless value.nil?
70
+
71
+ value
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module Authentication
3
5
  extend ActiveSupport::Concern
@@ -33,13 +35,14 @@ module PagesCore
33
35
  user = User.where(id: session[:current_user_id]).first
34
36
  end
35
37
 
36
- return unless user && user.can_login?
38
+ return unless user&.can_login?
37
39
 
38
40
  authenticate!(user)
39
41
  end
40
42
 
41
43
  def finalize_authenticated_session
42
44
  return unless current_user
45
+
43
46
  session[:current_user_id] = current_user.id
44
47
  end
45
48
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module ErrorRenderer
3
5
  extend ActiveSupport::Concern
@@ -23,6 +25,7 @@ module PagesCore
23
25
 
24
26
  def error_layout(error, options = {})
25
27
  return options[:layout] if options.key?(:layout)
28
+
26
29
  if error == 404 && PagesCore.config.error_404_layout?
27
30
  PagesCore.config.error_404_layout
28
31
  else
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module ErrorReporting
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_action :configure_sentry_context
9
+ end
10
+
11
+ protected
12
+
13
+ def configure_sentry_context
14
+ if Object.const_defined?("Sentry")
15
+ Sentry.set_user(current_user_context)
16
+ Sentry.set_tags(locale: params[:locale] || I18n.default_locale.to_s)
17
+ Sentry.set_extras(params: params.to_unsafe_h)
18
+ elsif Object.const_defined?("Raven")
19
+ configure_legacy_sentry_context
20
+ end
21
+ end
22
+
23
+ def configure_legacy_sentry_context
24
+ Raven.user_context(current_user_context)
25
+ Raven.tags_context(locale: params[:locale] || I18n.default_locale.to_s)
26
+ Raven.extra_context(params: params.to_unsafe_h)
27
+ end
28
+
29
+ def current_user_context
30
+ return { user_id: :guest } unless logged_in?
31
+
32
+ { user_id: current_user.id,
33
+ user_email: current_user.email }
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PoliciesHelper
3
5
  extend ActiveSupport::Concern
@@ -33,7 +35,8 @@ module PagesCore
33
35
  end
34
36
 
35
37
  def verify_policy(record)
36
- return true if policy(record).public_send(action_name + "?")
38
+ return true if policy(record).public_send("#{action_name}?")
39
+
37
40
  raise PagesCore::NotAuthorized
38
41
  end
39
42
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module PreviewPagesController
3
5
  extend ActiveSupport::Concern
@@ -8,6 +10,7 @@ module PagesCore
8
10
 
9
11
  def preview
10
12
  redirect_to(page_url(@locale, @page)) && return unless logged_in?
13
+
11
14
  @page.attributes = page_params.merge(
12
15
  status: 2,
13
16
  published_at: Time.zone.now,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module ProcessTitler
3
5
  extend ActiveSupport::Concern
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PagesCore
2
4
  module RssController
3
5
  extend ActiveSupport::Concern
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PagesCore
4
+ module StaticCacheController
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def static_cache(*actions, permanent: false)
9
+ return unless perform_caching
10
+
11
+ if permanent
12
+ after_action :cache_static_page_permanently, only: actions
13
+ else
14
+ after_action :cache_static_page, only: actions
15
+ end
16
+ end
17
+
18
+ alias caches_page static_cache
19
+ end
20
+
21
+ def disable_static_cache!
22
+ @static_cache_disabled = true
23
+ end
24
+
25
+ private
26
+
27
+ def cache_static_page
28
+ return unless static_cache_allowed?
29
+
30
+ PagesCore::StaticCache.handler.cache_page(
31
+ self, request, response
32
+ )
33
+ end
34
+
35
+ def cache_static_page_permanently
36
+ return unless static_cache_allowed?
37
+
38
+ PagesCore::StaticCache.handler.cache_page_permanently(
39
+ self, request, response
40
+ )
41
+ end
42
+
43
+ def static_cache_allowed?
44
+ (request.get? || request.head?) && response.status == 200 &&
45
+ perform_caching && !@static_cache_disabled
46
+ end
47
+ end
48
+ end
@@ -1,13 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ErrorsController < ::ApplicationController
2
4
  layout "errors"
3
5
 
4
- def report
5
- report = decrypt_report(params[:error_report])
6
- report[:user] = User.find_by(id: report[:user_id]) if report.key?(:user_id)
7
-
8
- deliver_error_report(report, params[:email], params[:description])
9
- end
10
-
11
6
  def show
12
7
  render_error params[:id].to_i
13
8
  end
@@ -30,54 +25,11 @@ class ErrorsController < ::ApplicationController
30
25
 
31
26
  def internal_error
32
27
  exception = request.env["action_dispatch.exception"]
33
- if !exception
34
- render_error 500
35
- elsif exception.is_a?(PagesCore::NotAuthorized)
36
- render_error 403
37
- else
38
- @report = encrypt_report(error_report(request, exception))
28
+ if exception
39
29
  wrapper = ActionDispatch::ExceptionWrapper.new(nil, exception)
40
30
  render_error wrapper.status_code
31
+ else
32
+ render_error 500
41
33
  end
42
34
  end
43
-
44
- private
45
-
46
- def deliver_error_report(report, from, description)
47
- AdminMailer.error_report(report, from, description).deliver_now
48
- end
49
-
50
- def decrypt_report(str)
51
- YAML.safe_load(report_encryptor.decrypt_and_verify(str))
52
- end
53
-
54
- def encrypt_report(report)
55
- report_encryptor.encrypt_and_sign(report.to_yaml)
56
- end
57
-
58
- def error_report(request, exception)
59
- { message: exception.to_s,
60
- url: request.original_url,
61
- env: request.env.select { |_, v| v.is_a?(String) },
62
- params: params.to_unsafe_h,
63
- session: session.to_hash,
64
- backtrace: exception_backtrace(exception),
65
- timestamp: Time.now.utc,
66
- user_id: current_user.try(&:id) }
67
- end
68
-
69
- def exception_backtrace(exception)
70
- Rails.backtrace_cleaner.send(:filter, exception.backtrace)
71
- end
72
-
73
- def report_encryptor
74
- ActiveSupport::MessageEncryptor.new(
75
- ActiveSupport::CachingKeyGenerator.new(
76
- ActiveSupport::KeyGenerator.new(
77
- Rails.application.secrets.secret_key_base,
78
- iterations: 1000
79
- )
80
- ).generate_key("encrypted error report")
81
- )
82
- end
83
35
  end