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.
- checksums.yaml +7 -0
- data/README.md +29 -0
- data/Rakefile +10 -0
- data/app/assets/images/pages/admin/description-bg.gif +0 -0
- data/app/assets/images/pages/admin/drag-handle.gif +0 -0
- data/app/assets/images/pages/admin/drag-icon.png +0 -0
- data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
- data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
- data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
- data/app/assets/images/pages/admin/icon.png +0 -0
- data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
- data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
- data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
- data/app/assets/images/pages/admin/loading-modal.gif +0 -0
- data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
- data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
- data/app/assets/images/pages/admin/warning-icon.gif +0 -0
- data/app/assets/images/pages/favicon.gif +0 -0
- data/app/assets/images/pages/feed-icon-14x14.png +0 -0
- data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +4 -0
- data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +139 -0
- data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +9 -0
- data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +47 -0
- data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +122 -0
- data/app/assets/javascripts/pages/admin/features/modal.js.coffee +66 -0
- data/app/assets/javascripts/pages/admin/features/page_images.js +329 -0
- data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +40 -0
- data/app/assets/javascripts/pages/admin/features/tag_editor.js +159 -0
- data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +17 -0
- data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +21 -0
- data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +57 -0
- data/app/assets/javascripts/pages/admin.js.coffee +54 -0
- data/app/assets/javascripts/pages/login_form.js.coffee +17 -0
- data/app/assets/stylesheets/pages/admin/buttons.css.erb +5 -0
- data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +94 -0
- data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +58 -0
- data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +178 -0
- data/app/assets/stylesheets/pages/admin/controllers/users.css.erb +3 -0
- data/app/assets/stylesheets/pages/admin/editable_image.css.erb +19 -0
- data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +73 -0
- data/app/assets/stylesheets/pages/admin/header.css.erb +129 -0
- data/app/assets/stylesheets/pages/admin/images.css.scss.erb +160 -0
- data/app/assets/stylesheets/pages/admin/links.css.erb +34 -0
- data/app/assets/stylesheets/pages/admin/list_table.css.erb +56 -0
- data/app/assets/stylesheets/pages/admin/login.css.scss.erb +32 -0
- data/app/assets/stylesheets/pages/admin/modal.css.erb +14 -0
- data/app/assets/stylesheets/pages/admin/pagination.css.scss +22 -0
- data/app/assets/stylesheets/pages/admin/print.css.erb +17 -0
- data/app/assets/stylesheets/pages/admin/sidebar.css.erb +39 -0
- data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +18 -0
- data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +48 -0
- data/app/assets/stylesheets/pages/admin/textarea.css.erb +55 -0
- data/app/assets/stylesheets/pages/admin.css.erb +404 -0
- data/app/assets/stylesheets/pages/errors.css +126 -0
- data/app/controller_dummies/admin/admin_controller.rb +6 -0
- data/app/controller_dummies/application_controller.rb +6 -0
- data/app/controller_dummies/frontend_controller.rb +4 -0
- data/app/controller_dummies/images_controller.rb +4 -0
- data/app/controller_dummies/page_files_controller.rb +4 -0
- data/app/controller_dummies/pages_controller.rb +4 -0
- data/app/controller_dummies/sitemaps_controller.rb +4 -0
- data/app/controllers/admin/categories_controller.rb +57 -0
- data/app/controllers/admin/images_controller.rb +48 -0
- data/app/controllers/admin/invites_controller.rb +79 -0
- data/app/controllers/admin/page_comments_controller.rb +61 -0
- data/app/controllers/admin/page_files_controller.rb +81 -0
- data/app/controllers/admin/page_images_controller.rb +116 -0
- data/app/controllers/admin/pages_controller.rb +179 -0
- data/app/controllers/admin/password_resets_controller.rb +83 -0
- data/app/controllers/admin/users_controller.rb +102 -0
- data/app/controllers/concerns/pages_core/authentication.rb +48 -0
- data/app/controllers/concerns/pages_core/domain_based_cache.rb +28 -0
- data/app/controllers/concerns/pages_core/exception_handler.rb +114 -0
- data/app/controllers/concerns/pages_core/policies_helper.rb +40 -0
- data/app/controllers/concerns/pages_core/process_titler.rb +44 -0
- data/app/controllers/errors_controller.rb +45 -0
- data/app/controllers/pages_core/admin_controller.rb +109 -0
- data/app/controllers/pages_core/application_controller.rb +31 -0
- data/app/controllers/pages_core/frontend/page_files_controller.rb +42 -0
- data/app/controllers/pages_core/frontend/pages_controller.rb +308 -0
- data/app/controllers/pages_core/frontend_controller.rb +34 -0
- data/app/controllers/pages_core/images_controller.rb +15 -0
- data/app/controllers/pages_core/sitemaps_controller.rb +73 -0
- data/app/controllers/sessions_controller.rb +38 -0
- data/app/formatters/pages_core/html_formatter.rb +86 -0
- data/app/helpers/admin/admin_helper.rb +7 -0
- data/app/helpers/admin/menu_helper.rb +65 -0
- data/app/helpers/admin/pages_helper.rb +74 -0
- data/app/helpers/application_helper.rb +5 -0
- data/app/helpers/frontend_helper.rb +5 -0
- data/app/helpers/pages_core/admin/admin_helper.rb +108 -0
- data/app/helpers/pages_core/admin/labelled_field_helper.rb +73 -0
- data/app/helpers/pages_core/admin/tag_editor_helper.rb +46 -0
- data/app/helpers/pages_core/application_helper.rb +65 -0
- data/app/helpers/pages_core/form_builder.rb +187 -0
- data/app/helpers/pages_core/frontend_helper.rb +21 -0
- data/app/helpers/pages_core/head_tags_helper.rb +270 -0
- data/app/helpers/pages_core/images_helper.rb +36 -0
- data/app/helpers/pages_core/login_helper.rb +14 -0
- data/app/indices/page_file_index.rb +9 -0
- data/app/indices/page_index.rb +29 -0
- data/app/indices/user_index.rb +11 -0
- data/app/jobs/pages_core/autopublish_job.rb +11 -0
- data/app/jobs/pages_core/sweep_cache_job.rb +11 -0
- data/app/mailers/admin_mailer.rb +46 -0
- data/app/models/autopublisher.rb +33 -0
- data/app/models/category.rb +23 -0
- data/app/models/concerns/pages_core/has_roles.rb +25 -0
- data/app/models/concerns/pages_core/humanizable_param.rb +17 -0
- data/app/models/concerns/pages_core/page_tree.rb +85 -0
- data/app/models/concerns/pages_core/searchable_page.rb +33 -0
- data/app/models/concerns/pages_core/sweepable.rb +23 -0
- data/app/models/concerns/pages_core/taggable.rb +46 -0
- data/app/models/concerns/pages_core/templateable.rb +85 -0
- data/app/models/image.rb +23 -0
- data/app/models/invite.rb +33 -0
- data/app/models/invite_role.rb +11 -0
- data/app/models/localization.rb +27 -0
- data/app/models/page.rb +281 -0
- data/app/models/page_builder.rb +61 -0
- data/app/models/page_comment.rb +18 -0
- data/app/models/page_file.rb +74 -0
- data/app/models/page_image.rb +62 -0
- data/app/models/password_reset_token.rb +38 -0
- data/app/models/role.rb +51 -0
- data/app/models/tag.rb +64 -0
- data/app/models/tagging.rb +22 -0
- data/app/models/user.rb +131 -0
- data/app/policies/invite_policy.rb +29 -0
- data/app/policies/page_file_policy.rb +25 -0
- data/app/policies/page_image_policy.rb +25 -0
- data/app/policies/page_policy.rb +33 -0
- data/app/policies/policy.rb +64 -0
- data/app/policies/user_policy.rb +49 -0
- data/app/serializers/admin/image_serializer.rb +10 -0
- data/app/serializers/admin/page_image_serializer.rb +6 -0
- data/app/serializers/page_image_serializer.rb +38 -0
- data/app/serializers/page_serializer.rb +21 -0
- data/app/views/admin/invites/new.html.erb +16 -0
- data/app/views/admin/invites/show.html.erb +25 -0
- data/app/views/admin/pages/_edit_comments.html.erb +21 -0
- data/app/views/admin/pages/_edit_content.html.erb +10 -0
- data/app/views/admin/pages/_edit_images.html.erb +84 -0
- data/app/views/admin/pages/_edit_metadata.html.erb +24 -0
- data/app/views/admin/pages/_edit_options.html.erb +72 -0
- data/app/views/admin/pages/_pagelisting.html.erb +63 -0
- data/app/views/admin/pages/edit.html.erb +161 -0
- data/app/views/admin/pages/index.html.erb +67 -0
- data/app/views/admin/pages/new.html.erb +48 -0
- data/app/views/admin/pages/news.html.erb +69 -0
- data/app/views/admin/password_resets/show.html.erb +24 -0
- data/app/views/admin/users/_access_control.html.erb +14 -0
- data/app/views/admin/users/_list.html.erb +62 -0
- data/app/views/admin/users/_login_form.html.erb +47 -0
- data/app/views/admin/users/deactivated.html.erb +12 -0
- data/app/views/admin/users/edit.html.erb +54 -0
- data/app/views/admin/users/index.html.erb +27 -0
- data/app/views/admin/users/login.html.erb +15 -0
- data/app/views/admin/users/new.html.erb +23 -0
- data/app/views/admin/users/new_password.html.erb +19 -0
- data/app/views/admin/users/show.html.erb +64 -0
- data/app/views/admin_mailer/comment_notification.text.erb +7 -0
- data/app/views/admin_mailer/error_report.html.erb +70 -0
- data/app/views/admin_mailer/invite.text.erb +9 -0
- data/app/views/admin_mailer/password_reset.text.erb +13 -0
- data/app/views/errors/403.html.erb +6 -0
- data/app/views/errors/404.html.erb +11 -0
- data/app/views/errors/405.html.erb +4 -0
- data/app/views/errors/500.html.erb +19 -0
- data/app/views/errors/500_critical.html.erb +7 -0
- data/app/views/errors/_generic_help.html.erb +21 -0
- data/app/views/errors/report.html.erb +4 -0
- data/app/views/feeds/pages.rss.builder +39 -0
- data/app/views/layouts/admin/_analytics.html.erb +18 -0
- data/app/views/layouts/admin/_header.html.erb +37 -0
- data/app/views/layouts/admin.html.erb +79 -0
- data/app/views/layouts/errors.html.erb +23 -0
- data/app/views/sitemaps/show.xml.builder +9 -0
- data/config/locales/en.yml +6 -0
- data/config/removed_migrations.yml +60 -0
- data/config/routes.rb +127 -0
- data/db/migrate/20111219033112_create_pages_tables.rb +281 -0
- data/db/migrate/20120627033112_rename_textbits.rb +19 -0
- data/db/migrate/20121010055412_drop_removed_tables.rb +83 -0
- data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +11 -0
- data/db/migrate/20130303053932_remove_filter_from_localizations.rb +11 -0
- data/db/migrate/20130303160632_remove_imagesets.rb +24 -0
- data/db/migrate/20130303161732_remove_sms_subscribers.rb +16 -0
- data/db/migrate/20130823133208_update_page_redirect_to.rb +25 -0
- data/db/migrate/20140203183900_create_roles.rb +63 -0
- data/db/migrate/20140414150500_change_locale_names.rb +13 -0
- data/db/migrate/20140515130100_remove_sphinx_deltas.rb +15 -0
- data/db/migrate/20140604142100_remove_openid_url.rb +9 -0
- data/db/migrate/20140920231700_convert_images_to_dis.rb +79 -0
- data/db/migrate/20140922124600_convert_page_files_to_dis.rb +50 -0
- data/db/migrate/20141004003100_create_password_reset_tokens.rb +10 -0
- data/db/migrate/20141006181300_remove_user_cruft.rb +11 -0
- data/db/migrate/20141007173000_create_invites.rb +16 -0
- data/db/migrate/20150204130800_update_delayed_job_table.rb +9 -0
- data/db/migrate/20150401131300_localize_images.rb +39 -0
- data/db/migrate/20150520174300_add_meta_image_to_page.rb +5 -0
- data/db/migrate/20150904164200_add_pinned_to_tags.rb +5 -0
- data/lib/pages_core/admin_menu_item.rb +22 -0
- data/lib/pages_core/archive_finder.rb +75 -0
- data/lib/pages_core/cache_sweeper.rb +112 -0
- data/lib/pages_core/configuration/base.rb +85 -0
- data/lib/pages_core/configuration/pages.rb +23 -0
- data/lib/pages_core/configuration.rb +9 -0
- data/lib/pages_core/engine.rb +27 -0
- data/lib/pages_core/extensions/hash_extensions.rb +23 -0
- data/lib/pages_core/extensions/string_extensions.rb +17 -0
- data/lib/pages_core/extensions.rb +4 -0
- data/lib/pages_core/localizable/active_record_extension.rb +41 -0
- data/lib/pages_core/localizable/class_methods.rb +51 -0
- data/lib/pages_core/localizable/configuration.rb +50 -0
- data/lib/pages_core/localizable/instance_methods.rb +130 -0
- data/lib/pages_core/localizable/localizer.rb +72 -0
- data/lib/pages_core/localizable/scope_extension.rb +22 -0
- data/lib/pages_core/localizable.rb +49 -0
- data/lib/pages_core/pages_plugin.rb +14 -0
- data/lib/pages_core/paginates.rb +102 -0
- data/lib/pages_core/plugin.rb +118 -0
- data/lib/pages_core/templates/block_configuration.rb +17 -0
- data/lib/pages_core/templates/configuration.rb +81 -0
- data/lib/pages_core/templates/configuration_handler.rb +62 -0
- data/lib/pages_core/templates/configuration_proxy.rb +28 -0
- data/lib/pages_core/templates/controller_actions.rb +32 -0
- data/lib/pages_core/templates/template_configuration.rb +198 -0
- data/lib/pages_core/templates.rb +53 -0
- data/lib/pages_core/version.rb +5 -0
- data/lib/pages_core.rb +89 -0
- data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +68 -0
- data/lib/rails/generators/pages_core/frontend/templates/application.css.scss.erb +3 -0
- data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +16 -0
- data/lib/rails/generators/pages_core/frontend/templates/base.css.scss.erb +3 -0
- data/lib/rails/generators/pages_core/frontend/templates/breakpoints.css.scss.erb +24 -0
- data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +8 -0
- data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +15 -0
- data/lib/rails/generators/pages_core/frontend/templates/normalize.css.erb +425 -0
- data/lib/rails/generators/pages_core/install/install_generator.rb +135 -0
- data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +1 -0
- data/lib/rails/generators/pages_core/install/templates/application_controller.rb +11 -0
- data/lib/rails/generators/pages_core/install/templates/application_helper.rb +5 -0
- data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +11 -0
- data/lib/rails/generators/pages_core/install/templates/default_page_template.html.erb +5 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job +7 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +3 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +6 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +5 -0
- data/lib/rails/generators/pages_core/install/templates/gitignore.erb +25 -0
- data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +67 -0
- data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +4 -0
- data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +45 -0
- data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +12 -0
- data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +34 -0
- data/lib/rails/generators/pages_core/rspec/templates/factories.rb +9 -0
- data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +9 -0
- data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +51 -0
- data/lib/tasks/db.rake +96 -0
- data/lib/tasks/pages/assets.rake +65 -0
- data/lib/tasks/pages/cache.rake +16 -0
- data/lib/tasks/pages/update.rake +19 -0
- data/lib/tasks/pages.rake +76 -0
- data/template.rb +19 -0
- data/vendor/assets/javascripts/jquery.dimscreen.js +77 -0
- data/vendor/assets/javascripts/jquery.fieldselection.js +59 -0
- 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
|