pages_core 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +29 -0
  3. data/Rakefile +10 -0
  4. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  5. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  6. data/app/assets/images/pages/admin/drag-icon.png +0 -0
  7. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  8. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  9. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  10. data/app/assets/images/pages/admin/icon.png +0 -0
  11. data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
  12. data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
  13. data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
  14. data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
  15. data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
  16. data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
  17. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  18. data/app/assets/images/pages/admin/loading-modal.gif +0 -0
  19. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  20. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  21. data/app/assets/images/pages/admin/warning-icon.gif +0 -0
  22. data/app/assets/images/pages/favicon.gif +0 -0
  23. data/app/assets/images/pages/feed-icon-14x14.png +0 -0
  24. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +4 -0
  25. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +139 -0
  26. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +9 -0
  27. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +47 -0
  28. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +122 -0
  29. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +66 -0
  30. data/app/assets/javascripts/pages/admin/features/page_images.js +329 -0
  31. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +40 -0
  32. data/app/assets/javascripts/pages/admin/features/tag_editor.js +159 -0
  33. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +17 -0
  34. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +21 -0
  35. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +57 -0
  36. data/app/assets/javascripts/pages/admin.js.coffee +54 -0
  37. data/app/assets/javascripts/pages/login_form.js.coffee +17 -0
  38. data/app/assets/stylesheets/pages/admin/buttons.css.erb +5 -0
  39. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +94 -0
  40. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +58 -0
  41. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +178 -0
  42. data/app/assets/stylesheets/pages/admin/controllers/users.css.erb +3 -0
  43. data/app/assets/stylesheets/pages/admin/editable_image.css.erb +19 -0
  44. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +73 -0
  45. data/app/assets/stylesheets/pages/admin/header.css.erb +129 -0
  46. data/app/assets/stylesheets/pages/admin/images.css.scss.erb +160 -0
  47. data/app/assets/stylesheets/pages/admin/links.css.erb +34 -0
  48. data/app/assets/stylesheets/pages/admin/list_table.css.erb +56 -0
  49. data/app/assets/stylesheets/pages/admin/login.css.scss.erb +32 -0
  50. data/app/assets/stylesheets/pages/admin/modal.css.erb +14 -0
  51. data/app/assets/stylesheets/pages/admin/pagination.css.scss +22 -0
  52. data/app/assets/stylesheets/pages/admin/print.css.erb +17 -0
  53. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +39 -0
  54. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +18 -0
  55. data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +48 -0
  56. data/app/assets/stylesheets/pages/admin/textarea.css.erb +55 -0
  57. data/app/assets/stylesheets/pages/admin.css.erb +404 -0
  58. data/app/assets/stylesheets/pages/errors.css +126 -0
  59. data/app/controller_dummies/admin/admin_controller.rb +6 -0
  60. data/app/controller_dummies/application_controller.rb +6 -0
  61. data/app/controller_dummies/frontend_controller.rb +4 -0
  62. data/app/controller_dummies/images_controller.rb +4 -0
  63. data/app/controller_dummies/page_files_controller.rb +4 -0
  64. data/app/controller_dummies/pages_controller.rb +4 -0
  65. data/app/controller_dummies/sitemaps_controller.rb +4 -0
  66. data/app/controllers/admin/categories_controller.rb +57 -0
  67. data/app/controllers/admin/images_controller.rb +48 -0
  68. data/app/controllers/admin/invites_controller.rb +79 -0
  69. data/app/controllers/admin/page_comments_controller.rb +61 -0
  70. data/app/controllers/admin/page_files_controller.rb +81 -0
  71. data/app/controllers/admin/page_images_controller.rb +116 -0
  72. data/app/controllers/admin/pages_controller.rb +179 -0
  73. data/app/controllers/admin/password_resets_controller.rb +83 -0
  74. data/app/controllers/admin/users_controller.rb +102 -0
  75. data/app/controllers/concerns/pages_core/authentication.rb +48 -0
  76. data/app/controllers/concerns/pages_core/domain_based_cache.rb +28 -0
  77. data/app/controllers/concerns/pages_core/exception_handler.rb +114 -0
  78. data/app/controllers/concerns/pages_core/policies_helper.rb +40 -0
  79. data/app/controllers/concerns/pages_core/process_titler.rb +44 -0
  80. data/app/controllers/errors_controller.rb +45 -0
  81. data/app/controllers/pages_core/admin_controller.rb +109 -0
  82. data/app/controllers/pages_core/application_controller.rb +31 -0
  83. data/app/controllers/pages_core/frontend/page_files_controller.rb +42 -0
  84. data/app/controllers/pages_core/frontend/pages_controller.rb +308 -0
  85. data/app/controllers/pages_core/frontend_controller.rb +34 -0
  86. data/app/controllers/pages_core/images_controller.rb +15 -0
  87. data/app/controllers/pages_core/sitemaps_controller.rb +73 -0
  88. data/app/controllers/sessions_controller.rb +38 -0
  89. data/app/formatters/pages_core/html_formatter.rb +86 -0
  90. data/app/helpers/admin/admin_helper.rb +7 -0
  91. data/app/helpers/admin/menu_helper.rb +65 -0
  92. data/app/helpers/admin/pages_helper.rb +74 -0
  93. data/app/helpers/application_helper.rb +5 -0
  94. data/app/helpers/frontend_helper.rb +5 -0
  95. data/app/helpers/pages_core/admin/admin_helper.rb +108 -0
  96. data/app/helpers/pages_core/admin/labelled_field_helper.rb +73 -0
  97. data/app/helpers/pages_core/admin/tag_editor_helper.rb +46 -0
  98. data/app/helpers/pages_core/application_helper.rb +65 -0
  99. data/app/helpers/pages_core/form_builder.rb +187 -0
  100. data/app/helpers/pages_core/frontend_helper.rb +21 -0
  101. data/app/helpers/pages_core/head_tags_helper.rb +270 -0
  102. data/app/helpers/pages_core/images_helper.rb +36 -0
  103. data/app/helpers/pages_core/login_helper.rb +14 -0
  104. data/app/indices/page_file_index.rb +9 -0
  105. data/app/indices/page_index.rb +29 -0
  106. data/app/indices/user_index.rb +11 -0
  107. data/app/jobs/pages_core/autopublish_job.rb +11 -0
  108. data/app/jobs/pages_core/sweep_cache_job.rb +11 -0
  109. data/app/mailers/admin_mailer.rb +46 -0
  110. data/app/models/autopublisher.rb +33 -0
  111. data/app/models/category.rb +23 -0
  112. data/app/models/concerns/pages_core/has_roles.rb +25 -0
  113. data/app/models/concerns/pages_core/humanizable_param.rb +17 -0
  114. data/app/models/concerns/pages_core/page_tree.rb +85 -0
  115. data/app/models/concerns/pages_core/searchable_page.rb +33 -0
  116. data/app/models/concerns/pages_core/sweepable.rb +23 -0
  117. data/app/models/concerns/pages_core/taggable.rb +46 -0
  118. data/app/models/concerns/pages_core/templateable.rb +85 -0
  119. data/app/models/image.rb +23 -0
  120. data/app/models/invite.rb +33 -0
  121. data/app/models/invite_role.rb +11 -0
  122. data/app/models/localization.rb +27 -0
  123. data/app/models/page.rb +281 -0
  124. data/app/models/page_builder.rb +61 -0
  125. data/app/models/page_comment.rb +18 -0
  126. data/app/models/page_file.rb +74 -0
  127. data/app/models/page_image.rb +62 -0
  128. data/app/models/password_reset_token.rb +38 -0
  129. data/app/models/role.rb +51 -0
  130. data/app/models/tag.rb +64 -0
  131. data/app/models/tagging.rb +22 -0
  132. data/app/models/user.rb +131 -0
  133. data/app/policies/invite_policy.rb +29 -0
  134. data/app/policies/page_file_policy.rb +25 -0
  135. data/app/policies/page_image_policy.rb +25 -0
  136. data/app/policies/page_policy.rb +33 -0
  137. data/app/policies/policy.rb +64 -0
  138. data/app/policies/user_policy.rb +49 -0
  139. data/app/serializers/admin/image_serializer.rb +10 -0
  140. data/app/serializers/admin/page_image_serializer.rb +6 -0
  141. data/app/serializers/page_image_serializer.rb +38 -0
  142. data/app/serializers/page_serializer.rb +21 -0
  143. data/app/views/admin/invites/new.html.erb +16 -0
  144. data/app/views/admin/invites/show.html.erb +25 -0
  145. data/app/views/admin/pages/_edit_comments.html.erb +21 -0
  146. data/app/views/admin/pages/_edit_content.html.erb +10 -0
  147. data/app/views/admin/pages/_edit_images.html.erb +84 -0
  148. data/app/views/admin/pages/_edit_metadata.html.erb +24 -0
  149. data/app/views/admin/pages/_edit_options.html.erb +72 -0
  150. data/app/views/admin/pages/_pagelisting.html.erb +63 -0
  151. data/app/views/admin/pages/edit.html.erb +161 -0
  152. data/app/views/admin/pages/index.html.erb +67 -0
  153. data/app/views/admin/pages/new.html.erb +48 -0
  154. data/app/views/admin/pages/news.html.erb +69 -0
  155. data/app/views/admin/password_resets/show.html.erb +24 -0
  156. data/app/views/admin/users/_access_control.html.erb +14 -0
  157. data/app/views/admin/users/_list.html.erb +62 -0
  158. data/app/views/admin/users/_login_form.html.erb +47 -0
  159. data/app/views/admin/users/deactivated.html.erb +12 -0
  160. data/app/views/admin/users/edit.html.erb +54 -0
  161. data/app/views/admin/users/index.html.erb +27 -0
  162. data/app/views/admin/users/login.html.erb +15 -0
  163. data/app/views/admin/users/new.html.erb +23 -0
  164. data/app/views/admin/users/new_password.html.erb +19 -0
  165. data/app/views/admin/users/show.html.erb +64 -0
  166. data/app/views/admin_mailer/comment_notification.text.erb +7 -0
  167. data/app/views/admin_mailer/error_report.html.erb +70 -0
  168. data/app/views/admin_mailer/invite.text.erb +9 -0
  169. data/app/views/admin_mailer/password_reset.text.erb +13 -0
  170. data/app/views/errors/403.html.erb +6 -0
  171. data/app/views/errors/404.html.erb +11 -0
  172. data/app/views/errors/405.html.erb +4 -0
  173. data/app/views/errors/500.html.erb +19 -0
  174. data/app/views/errors/500_critical.html.erb +7 -0
  175. data/app/views/errors/_generic_help.html.erb +21 -0
  176. data/app/views/errors/report.html.erb +4 -0
  177. data/app/views/feeds/pages.rss.builder +39 -0
  178. data/app/views/layouts/admin/_analytics.html.erb +18 -0
  179. data/app/views/layouts/admin/_header.html.erb +37 -0
  180. data/app/views/layouts/admin.html.erb +79 -0
  181. data/app/views/layouts/errors.html.erb +23 -0
  182. data/app/views/sitemaps/show.xml.builder +9 -0
  183. data/config/locales/en.yml +6 -0
  184. data/config/removed_migrations.yml +60 -0
  185. data/config/routes.rb +127 -0
  186. data/db/migrate/20111219033112_create_pages_tables.rb +281 -0
  187. data/db/migrate/20120627033112_rename_textbits.rb +19 -0
  188. data/db/migrate/20121010055412_drop_removed_tables.rb +83 -0
  189. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +11 -0
  190. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +11 -0
  191. data/db/migrate/20130303160632_remove_imagesets.rb +24 -0
  192. data/db/migrate/20130303161732_remove_sms_subscribers.rb +16 -0
  193. data/db/migrate/20130823133208_update_page_redirect_to.rb +25 -0
  194. data/db/migrate/20140203183900_create_roles.rb +63 -0
  195. data/db/migrate/20140414150500_change_locale_names.rb +13 -0
  196. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +15 -0
  197. data/db/migrate/20140604142100_remove_openid_url.rb +9 -0
  198. data/db/migrate/20140920231700_convert_images_to_dis.rb +79 -0
  199. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +50 -0
  200. data/db/migrate/20141004003100_create_password_reset_tokens.rb +10 -0
  201. data/db/migrate/20141006181300_remove_user_cruft.rb +11 -0
  202. data/db/migrate/20141007173000_create_invites.rb +16 -0
  203. data/db/migrate/20150204130800_update_delayed_job_table.rb +9 -0
  204. data/db/migrate/20150401131300_localize_images.rb +39 -0
  205. data/db/migrate/20150520174300_add_meta_image_to_page.rb +5 -0
  206. data/db/migrate/20150904164200_add_pinned_to_tags.rb +5 -0
  207. data/lib/pages_core/admin_menu_item.rb +22 -0
  208. data/lib/pages_core/archive_finder.rb +75 -0
  209. data/lib/pages_core/cache_sweeper.rb +112 -0
  210. data/lib/pages_core/configuration/base.rb +85 -0
  211. data/lib/pages_core/configuration/pages.rb +23 -0
  212. data/lib/pages_core/configuration.rb +9 -0
  213. data/lib/pages_core/engine.rb +27 -0
  214. data/lib/pages_core/extensions/hash_extensions.rb +23 -0
  215. data/lib/pages_core/extensions/string_extensions.rb +17 -0
  216. data/lib/pages_core/extensions.rb +4 -0
  217. data/lib/pages_core/localizable/active_record_extension.rb +41 -0
  218. data/lib/pages_core/localizable/class_methods.rb +51 -0
  219. data/lib/pages_core/localizable/configuration.rb +50 -0
  220. data/lib/pages_core/localizable/instance_methods.rb +130 -0
  221. data/lib/pages_core/localizable/localizer.rb +72 -0
  222. data/lib/pages_core/localizable/scope_extension.rb +22 -0
  223. data/lib/pages_core/localizable.rb +49 -0
  224. data/lib/pages_core/pages_plugin.rb +14 -0
  225. data/lib/pages_core/paginates.rb +102 -0
  226. data/lib/pages_core/plugin.rb +118 -0
  227. data/lib/pages_core/templates/block_configuration.rb +17 -0
  228. data/lib/pages_core/templates/configuration.rb +81 -0
  229. data/lib/pages_core/templates/configuration_handler.rb +62 -0
  230. data/lib/pages_core/templates/configuration_proxy.rb +28 -0
  231. data/lib/pages_core/templates/controller_actions.rb +32 -0
  232. data/lib/pages_core/templates/template_configuration.rb +198 -0
  233. data/lib/pages_core/templates.rb +53 -0
  234. data/lib/pages_core/version.rb +5 -0
  235. data/lib/pages_core.rb +89 -0
  236. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +68 -0
  237. data/lib/rails/generators/pages_core/frontend/templates/application.css.scss.erb +3 -0
  238. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +16 -0
  239. data/lib/rails/generators/pages_core/frontend/templates/base.css.scss.erb +3 -0
  240. data/lib/rails/generators/pages_core/frontend/templates/breakpoints.css.scss.erb +24 -0
  241. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +8 -0
  242. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +15 -0
  243. data/lib/rails/generators/pages_core/frontend/templates/normalize.css.erb +425 -0
  244. data/lib/rails/generators/pages_core/install/install_generator.rb +135 -0
  245. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +1 -0
  246. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +11 -0
  247. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +5 -0
  248. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +11 -0
  249. data/lib/rails/generators/pages_core/install/templates/default_page_template.html.erb +5 -0
  250. data/lib/rails/generators/pages_core/install/templates/delayed_job +7 -0
  251. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +3 -0
  252. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +6 -0
  253. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +5 -0
  254. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +25 -0
  255. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +67 -0
  256. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +4 -0
  257. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +45 -0
  258. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +12 -0
  259. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +34 -0
  260. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +9 -0
  261. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +9 -0
  262. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +51 -0
  263. data/lib/tasks/db.rake +96 -0
  264. data/lib/tasks/pages/assets.rake +65 -0
  265. data/lib/tasks/pages/cache.rake +16 -0
  266. data/lib/tasks/pages/update.rake +19 -0
  267. data/lib/tasks/pages.rake +76 -0
  268. data/template.rb +19 -0
  269. data/vendor/assets/javascripts/jquery.dimscreen.js +77 -0
  270. data/vendor/assets/javascripts/jquery.fieldselection.js +59 -0
  271. metadata +690 -0
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module Authentication
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_action :start_authenticated_session
9
+ after_action :finalize_authenticated_session
10
+ helper_method :current_user, :logged_in?
11
+ end
12
+
13
+ # Returns the current user if logged in, or nil.
14
+ attr_reader :current_user
15
+
16
+ # Returns true if the user is logged in.
17
+ def logged_in?
18
+ current_user ? true : false
19
+ end
20
+
21
+ def authenticate!(user)
22
+ user.mark_active!
23
+ @current_user = user
24
+ end
25
+
26
+ def deauthenticate!
27
+ @current_user = nil
28
+ session[:current_user_id] = nil
29
+ end
30
+
31
+ protected
32
+
33
+ def start_authenticated_session
34
+ if session[:current_user_id]
35
+ user = User.where(id: session[:current_user_id]).first
36
+ end
37
+
38
+ return unless user && user.can_login?
39
+
40
+ authenticate!(user)
41
+ end
42
+
43
+ def finalize_authenticated_session
44
+ return unless current_user
45
+ session[:current_user_id] = current_user.id
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module DomainBasedCache
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_action :set_domain_based_cache_path
9
+ end
10
+
11
+ module ClassMethods
12
+ def default_page_cache_directory
13
+ @default_page_cache_directory ||=
14
+ ActionController::Base.page_cache_directory
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def set_domain_based_cache_path
21
+ return unless PagesCore.config(:domain_based_cache)
22
+ ActionController::Base.page_cache_directory = File.join(
23
+ ApplicationController.default_page_cache_directory,
24
+ request.domain
25
+ )
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,114 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module ExceptionHandler
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ unless Rails.application.config.consider_all_requests_local
9
+ rescue_from Exception, with: :handle_exception
10
+ rescue_from PagesCore::NotAuthorized, with: :handle_exception
11
+ rescue_from ActiveRecord::RecordNotFound, with: :handle_exception
12
+ rescue_from ActionController::RoutingError, with: :handle_exception
13
+ rescue_from ActionController::UnknownController, with: :handle_exception
14
+ rescue_from AbstractController::ActionNotFound, with: :handle_exception
15
+ end
16
+ end
17
+
18
+ # Renders a fancy error page from app/views/errors. If the error name
19
+ # is numeric, it will also be set as the response status. Example:
20
+ #
21
+ # render_error 404
22
+ #
23
+ def render_error(error, options = {})
24
+ options[:status] ||= error if error.is_a? Numeric
25
+ options[:template] ||= "errors/#{error}"
26
+ options[:layout] ||= "errors"
27
+ @email = logged_in? ? current_user.email : ""
28
+ render options
29
+ end
30
+
31
+ protected
32
+
33
+ def log_error(exception)
34
+ trace = exception.backtrace
35
+ ActiveSupport::Deprecation.silence do
36
+ message = "\n#{exception.class} (#{exception.message}):\n"
37
+ if exception.respond_to?(:annoted_source_code)
38
+ message << exception.annoted_source_code.to_s
39
+ end
40
+ message << " " << trace.join("\n ")
41
+ logger.fatal("#{message}\n\n")
42
+ end
43
+ end
44
+
45
+ def env_as_object
46
+ request.env.each_with_object({}) do |hash, value|
47
+ if value.first.is_a?(String) && value.last.is_a?(String)
48
+ hash[value.first] = value.last
49
+ end
50
+ end
51
+ end
52
+
53
+ def filtered_backtrace(exception)
54
+ Rails.backtrace_cleaner.send(:filter, exception.backtrace)
55
+ end
56
+
57
+ def exception_url
58
+ [
59
+ "http://",
60
+ request.env["HTTP_HOST"],
61
+ request.env["REQUEST_URI"]
62
+ ].compact.join
63
+ end
64
+
65
+ def error_report(exception)
66
+ {
67
+ message: exception.to_s,
68
+ url: exception_url,
69
+ params: params,
70
+ env: env_as_object,
71
+ session: session.to_hash,
72
+ backtrace: filtered_backtrace(exception),
73
+ timestamp: Time.now,
74
+ user_id: logged_in? ? current_user.id : nil
75
+ }
76
+ end
77
+
78
+ def write_error(str)
79
+ sha1_hash = Digest::SHA1.hexdigest(str)
80
+ error_report_dir = Rails.root.join("log", "error_reports")
81
+ error_report_file = error_report_dir.join("#{sha1_hash}.yml")
82
+ `mkdir -p #{error_report_dir}` unless File.exist?(error_report_dir)
83
+
84
+ unless File.exist?(error_report_file)
85
+ File.open(error_report_file, "w") do |fh|
86
+ fh.write str
87
+ end
88
+ end
89
+ sha1_hash
90
+ end
91
+
92
+ def handle_exception(exception)
93
+ log_error exception
94
+ if exception.is_a?(ActionController::RoutingError) ||
95
+ exception.is_a?(ActiveRecord::RecordNotFound)
96
+ render_error 404
97
+ elsif exception.is_a?(PagesCore::NotAuthorized)
98
+ render_error 403
99
+ else
100
+ session[:error_report] = @error_id = write_error(
101
+ error_report(exception).to_yaml
102
+ )
103
+ logger.error "Logged error #{@error_id}"
104
+
105
+ render_error 500
106
+ end
107
+ rescue => error
108
+ logger.fatal "Error in handle_exception"
109
+ log_error(error)
110
+ render(template: "errors/500_critical", status: 500, layout: false)
111
+ return
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,40 @@
1
+ module PagesCore
2
+ module PoliciesHelper
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :policy
7
+ end
8
+
9
+ module ClassMethods
10
+ def require_authorization(collection, member, options = {})
11
+ options = {
12
+ collection: [:index, :new, :create],
13
+ member: [:show, :edit, :update, :destroy]
14
+ }.merge(options)
15
+ before_action do |controller|
16
+ action = params[:action].to_sym
17
+ if options[:collection].include?(action)
18
+ verify_policy_with_proc(controller, collection)
19
+ elsif options[:member].include?(action)
20
+ verify_policy_with_proc(controller, member)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ def policy(object)
27
+ Policy.for(current_user, object)
28
+ end
29
+
30
+ def verify_policy_with_proc(controller, record)
31
+ record = controller.instance_eval(&record) if record.is_a?(Proc)
32
+ verify_policy(record)
33
+ end
34
+
35
+ def verify_policy(record)
36
+ return true if policy(record).public_send(params[:action] + "?")
37
+ fail PagesCore::NotAuthorized
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module ProcessTitler
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ before_action :set_process_title
9
+ after_action :unset_process_title
10
+ end
11
+
12
+ class << self
13
+ attr_accessor :number_of_requests
14
+
15
+ def original_title
16
+ @original_title ||= $PROGRAM_NAME
17
+ end
18
+
19
+ def inc_number_of_requests
20
+ @number_of_requests ||= 0
21
+ @number_of_requests += 1
22
+ yield @number_of_requests
23
+ end
24
+
25
+ def number_of_requests
26
+ @number_of_requests ||= 0
27
+ end
28
+ end
29
+
30
+ protected
31
+
32
+ def set_process_title
33
+ PagesCore::ProcessTitler.inc_number_of_requests do |i|
34
+ $0 = PagesCore::ProcessTitler.original_title +
35
+ ": Handling #{request.path} (#{i} reqs)"
36
+ end
37
+ end
38
+
39
+ def unset_process_title
40
+ $0 = PagesCore::ProcessTitler.original_title +
41
+ ": Idle (#{PagesCore::ProcessTitler.number_of_requests} reqs)"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ class ErrorsController < ApplicationController
4
+ layout "errors"
5
+
6
+ skip_before_action :verify_authenticity_token
7
+
8
+ def report
9
+ return unless session[:error_report]
10
+ deliver_error_report(
11
+ find_error_report,
12
+ params[:email],
13
+ params[:description]
14
+ )
15
+ @error_id = session[:error_report]
16
+ end
17
+
18
+ def show
19
+ render_error params[:id].to_i
20
+ end
21
+
22
+ private
23
+
24
+ def deliver_error_report(report, from, description)
25
+ AdminMailer.error_report(report, from, description).deliver_now
26
+ end
27
+
28
+ def find_error_report
29
+ report = YAML.load_file(error_report_path)
30
+ if report[:user_id]
31
+ report[:user] = begin
32
+ User.find(report[:user_id])
33
+ rescue
34
+ nil
35
+ end
36
+ end
37
+ report
38
+ end
39
+
40
+ def error_report_path
41
+ Rails.root
42
+ .join("log", "error_reports")
43
+ .join("#{session[:error_report]}.yml")
44
+ end
45
+ end
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+
3
+ # All admin controllers inherit Admin::AdminController, which provides layout,
4
+ # authorization and other common code for the Admin set of controllers.
5
+ module PagesCore
6
+ class AdminController < ApplicationController
7
+ before_action :set_i18n_locale
8
+ before_action :require_authentication
9
+ before_action :restore_persistent_params
10
+ after_action :save_persistent_params
11
+
12
+ layout "admin"
13
+
14
+ def redirect
15
+ if Page.news_pages.any?
16
+ redirect_to news_admin_pages_url(@locale)
17
+ else
18
+ redirect_to admin_pages_url(@locale)
19
+ end
20
+ end
21
+
22
+ protected
23
+
24
+ def set_i18n_locale
25
+ I18n.locale = :en
26
+ end
27
+
28
+ # Verifies the login. Redirects to users/new if the users table is empty.
29
+ # If not, renders the login screen.
30
+ def require_authentication
31
+ return if logged_in?
32
+ if User.count < 1
33
+ redirect_to(new_admin_user_url) && return
34
+ else
35
+ redirect_to(login_admin_users_url) && return
36
+ end
37
+ end
38
+
39
+ # Loads persistent params from user model and merges with session.
40
+ def restore_persistent_params
41
+ return unless current_user && current_user.persistent_data?
42
+ session[:persistent_params] ||= {}
43
+ session[:persistent_params] = current_user.persistent_data.merge(
44
+ session[:persistent_params]
45
+ )
46
+ end
47
+
48
+ # Saves persistent params from session to User model if applicable.
49
+ def save_persistent_params
50
+ return unless current_user && session[:persistent_params]
51
+ current_user.persistent_data = session[:persistent_params]
52
+ current_user.save
53
+ end
54
+
55
+ def secure_compare(a, b)
56
+ return false unless a && b
57
+ return false unless a.bytesize == b.bytesize
58
+
59
+ l = a.unpack "C#{a.bytesize}"
60
+
61
+ res = 0
62
+ b.each_byte { |byte| res |= byte ^ l.shift }
63
+ res == 0
64
+ end
65
+
66
+ # --- HELPERS ---
67
+
68
+ # Get name of class with in lowercase, with underscores.
69
+ def self.underscore
70
+ ActiveSupport::Inflector.underscore(to_s).split(/\//).last
71
+ end
72
+
73
+ # Add a stylesheet
74
+ def add_stylesheet(css_file)
75
+ @admin_stylesheets ||= []
76
+ @admin_stylesheets << "admin/#{css_file}"
77
+ end
78
+
79
+ def persistent_params(namespace)
80
+ session[:persistent_params] ||= {}
81
+ session[:persistent_params][namespace] ||= {}
82
+ session[:persistent_params][namespace]
83
+ end
84
+
85
+ def coerce_persistent_param(v)
86
+ case v
87
+ when "true"
88
+ true
89
+ when "false"
90
+ false
91
+ else
92
+ v
93
+ end
94
+ end
95
+
96
+ # Get a persistent param
97
+ def persistent_param(key, default = nil, options = {})
98
+ namespace = options[:namespace] || self.class.to_s
99
+
100
+ value = coerce_persistent_param(params.key?(key) ? params[key] : default)
101
+
102
+ if !value.nil? || options[:preserve_nil]
103
+ persistent_params(namespace)[key] = value
104
+ end
105
+
106
+ value
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ class ApplicationController < ActionController::Base
5
+ include PagesCore::Authentication
6
+ include PagesCore::DomainBasedCache
7
+ include PagesCore::ExceptionHandler
8
+ include PagesCore::ProcessTitler
9
+ include PagesCore::PoliciesHelper
10
+
11
+ before_action :set_locale
12
+ after_action :set_content_language_header
13
+
14
+ protected
15
+
16
+ # Sets @locale from params[:locale], with I18n.default_locale as fallback
17
+ def set_locale
18
+ legacy_locales = {
19
+ "nor" => "nb",
20
+ "eng" => "en"
21
+ }
22
+ @locale = params[:locale] || I18n.default_locale.to_s
23
+ @locale = legacy_locales[@locale] if legacy_locales[@locale]
24
+ end
25
+
26
+ def set_content_language_header
27
+ return unless locale
28
+ headers["Content-Language"] = locale.to_s
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module Frontend
5
+ class PageFilesController < ::FrontendController
6
+ before_action :find_page_file, only: [:show, :edit, :update, :destroy]
7
+
8
+ def show
9
+ if !modified?(@page_file)
10
+ render(text: "304 Not Modified", status: 304) && return
11
+ end
12
+
13
+ if @page_file.updated_at?
14
+ response.headers["Last-Modified"] = @page_file.updated_at.httpdate
15
+ end
16
+
17
+ send_data(
18
+ @page_file.data,
19
+ filename: @page_file.filename,
20
+ type: @page_file.content_type,
21
+ disposition: "attachment"
22
+ )
23
+ end
24
+
25
+ private
26
+
27
+ def modified?(page_file)
28
+ return true unless if_modified_since && page_file.updated_at?
29
+ page_file.updated_at > if_modified_since
30
+ end
31
+
32
+ def if_modified_since
33
+ return nil if request.env["HTTP_IF_MODIFIED_SINCE"].blank?
34
+ Time.rfc2822(request.env["HTTP_IF_MODIFIED_SINCE"])
35
+ end
36
+
37
+ def find_page_file
38
+ @page_file = PageFile.find(params[:id])
39
+ end
40
+ end
41
+ end
42
+ end