camaleon_cms 2.9.1 → 2.9.3
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 +4 -4
- data/README.md +29 -9
- data/Rakefile +3 -16
- data/app/apps/plugins/attack/admin_controller.rb +9 -6
- data/app/apps/plugins/attack/attack_helper.rb +35 -25
- data/app/apps/plugins/authoring_post/authoring_post_helper.rb +23 -16
- data/app/apps/plugins/front_cache/admin_controller.rb +16 -10
- data/app/apps/plugins/front_cache/config/initializer.rb +1 -1
- data/app/apps/plugins/front_cache/front_cache_helper.rb +57 -24
- data/app/apps/plugins/visibility_post/config/config.json +1 -0
- data/app/apps/plugins/visibility_post/config/routes_front.txt +1 -0
- data/app/apps/plugins/visibility_post/front_controller.rb +23 -0
- data/app/apps/plugins/visibility_post/visibility_post_helper.rb +141 -70
- data/app/apps/themes/camaleon_first/main_helper.rb +18 -12
- data/app/apps/themes/default/assets/css/style.css.scss +24 -0
- data/app/apps/themes/default/assets/genericons/genericons.css +3 -8
- data/app/apps/themes/default/default_helper.rb +2 -1
- data/app/apps/themes/default/views/category.html.erb +1 -1
- data/app/apps/themes/default/views/layouts/index.html.erb +3 -1
- data/app/apps/themes/default/views/post_tag.html.erb +1 -1
- data/app/apps/themes/default/views/post_type.html.erb +1 -1
- data/app/apps/themes/default/views/search.html.erb +1 -1
- data/app/apps/themes/new/assets/css/styles.css.scss +24 -0
- data/app/apps/themes/new/custom_helper.rb +5 -9
- data/app/apps/themes/new/views/category.html.erb +1 -1
- data/app/apps/themes/new/views/layouts/_header.html.erb +3 -1
- data/app/apps/themes/new/views/post_tag.html.erb +1 -1
- data/app/apps/themes/new/views/post_type.html.erb +1 -1
- data/app/apps/themes/new/views/search.html.erb +1 -1
- data/app/assets/javascripts/camaleon_cms/admin/_data.js +16 -0
- data/app/assets/javascripts/camaleon_cms/admin/_post.js +5 -2
- data/app/assets/javascripts/camaleon_cms/admin/nav_menu.js +14 -3
- data/app/assets/javascripts/camaleon_cms/admin/uploader/_media_manager.js +5 -0
- data/app/controllers/camaleon_cms/admin/appearances/nav_menus_controller.rb +29 -10
- data/app/controllers/camaleon_cms/admin/appearances/themes_controller.rb +8 -5
- data/app/controllers/camaleon_cms/admin/appearances/widgets/assign_controller.rb +9 -2
- data/app/controllers/camaleon_cms/admin/appearances/widgets/main_controller.rb +4 -3
- data/app/controllers/camaleon_cms/admin/appearances/widgets/sidebar_controller.rb +2 -2
- data/app/controllers/camaleon_cms/admin/categories_controller.rb +27 -8
- data/app/controllers/camaleon_cms/admin/comments_controller.rb +0 -1
- data/app/controllers/camaleon_cms/admin/installers_controller.rb +32 -1
- data/app/controllers/camaleon_cms/admin/media_controller.rb +84 -19
- data/app/controllers/camaleon_cms/admin/plugins_controller.rb +1 -3
- data/app/controllers/camaleon_cms/admin/post_tags_controller.rb +15 -6
- data/app/controllers/camaleon_cms/admin/posts/drafts_controller.rb +40 -11
- data/app/controllers/camaleon_cms/admin/posts_controller.rb +58 -22
- data/app/controllers/camaleon_cms/admin/sessions_controller.rb +238 -45
- data/app/controllers/camaleon_cms/admin/settings/custom_fields_controller.rb +103 -18
- data/app/controllers/camaleon_cms/admin/settings/post_types_controller.rb +17 -5
- data/app/controllers/camaleon_cms/admin/settings/sites_controller.rb +33 -7
- data/app/controllers/camaleon_cms/admin/settings_controller.rb +11 -6
- data/app/controllers/camaleon_cms/admin/user_roles_controller.rb +9 -7
- data/app/controllers/camaleon_cms/admin/users_controller.rb +89 -18
- data/app/controllers/camaleon_cms/admin_controller.rb +144 -26
- data/app/controllers/camaleon_cms/apps/plugins_admin_controller.rb +5 -0
- data/app/controllers/camaleon_cms/camaleon_controller.rb +37 -92
- data/app/controllers/camaleon_cms/frontend_controller.rb +140 -70
- data/app/controllers/concerns/camaleon_cms/admin/custom_fields_concern.rb +44 -0
- data/app/controllers/concerns/camaleon_cms/frontend_concern.rb +46 -17
- data/app/controllers/concerns/camaleon_cms/frontend_visited_state_concern.rb +72 -0
- data/app/controllers/concerns/camaleon_cms/hook_lifecycle_concern.rb +104 -0
- data/app/controllers/concerns/camaleon_cms/request_context_concern.rb +113 -0
- data/app/controllers/concerns/camaleon_cms/runtime_admin_menu_concern.rb +237 -0
- data/app/controllers/concerns/camaleon_cms/runtime_captcha_image_concern.rb +13 -0
- data/app/controllers/concerns/camaleon_cms/runtime_html_content_concern.rb +143 -0
- data/app/controllers/concerns/camaleon_cms/runtime_shortcode_theme_concern.rb +246 -0
- data/app/controllers/concerns/camaleon_cms/runtime_state_concern.rb +13 -0
- data/app/controllers/concerns/camaleon_cms/runtime_uploader_concern.rb +54 -0
- data/app/controllers/concerns/camaleon_cms/session_captcha_runtime_concern.rb +19 -0
- data/app/controllers/concerns/camaleon_cms/session_runtime_concern.rb +40 -0
- data/app/decorators/camaleon_cms/application_decorator.rb +11 -8
- data/app/decorators/camaleon_cms/category_decorator.rb +3 -2
- data/app/decorators/camaleon_cms/post_comment_decorator.rb +13 -5
- data/app/decorators/camaleon_cms/post_decorator.rb +67 -51
- data/app/decorators/camaleon_cms/post_type_decorator.rb +1 -1
- data/app/decorators/camaleon_cms/site_decorator.rb +29 -23
- data/app/decorators/camaleon_cms/term_taxonomy_decorator.rb +21 -10
- data/app/decorators/camaleon_cms/theme_decorator.rb +3 -3
- data/app/decorators/camaleon_cms/user_decorator.rb +26 -5
- data/app/helpers/camaleon_cms/admin/application_helper.rb +21 -24
- data/app/helpers/camaleon_cms/admin/breadcrumb_helper.rb +1 -1
- data/app/helpers/camaleon_cms/admin/custom_fields_helper.rb +24 -23
- data/app/helpers/camaleon_cms/admin/menus_helper.rb +249 -139
- data/app/helpers/camaleon_cms/admin/post_type_helper.rb +51 -31
- data/app/helpers/camaleon_cms/camaleon_helper.rb +31 -39
- data/app/helpers/camaleon_cms/captcha_helper.rb +73 -53
- data/app/helpers/camaleon_cms/comment_helper.rb +87 -41
- data/app/helpers/camaleon_cms/content_helper.rb +13 -6
- data/app/helpers/camaleon_cms/email_helper.rb +7 -3
- data/app/helpers/camaleon_cms/frontend/content_select_helper.rb +34 -20
- data/app/helpers/camaleon_cms/frontend/nav_menu_helper.rb +144 -67
- data/app/helpers/camaleon_cms/frontend/seo_helper.rb +39 -28
- data/app/helpers/camaleon_cms/frontend/site_helper.rb +32 -12
- data/app/helpers/camaleon_cms/hooks_helper.rb +14 -4
- data/app/helpers/camaleon_cms/html_helper.rb +73 -38
- data/app/helpers/camaleon_cms/plugins_helper.rb +23 -24
- data/app/helpers/camaleon_cms/session_helper.rb +195 -39
- data/app/helpers/camaleon_cms/short_code_helper.rb +181 -85
- data/app/helpers/camaleon_cms/site_helper.rb +43 -9
- data/app/helpers/camaleon_cms/theme_helper.rb +35 -19
- data/app/helpers/camaleon_cms/uploader_helper.rb +19 -422
- data/app/helpers/camaleon_cms/user_roles_helper.rb +5 -4
- data/app/mailers/camaleon_cms/html_mailer.rb +4 -4
- data/app/models/camaleon_cms/ability.rb +65 -105
- data/app/models/camaleon_cms/category.rb +7 -5
- data/app/models/camaleon_cms/custom_field.rb +29 -6
- data/app/models/camaleon_cms/custom_field_group.rb +75 -21
- data/app/models/camaleon_cms/custom_fields_relationship.rb +133 -2
- data/app/models/camaleon_cms/media.rb +8 -2
- data/app/models/camaleon_cms/meta.rb +2 -2
- data/app/models/camaleon_cms/nav_menu.rb +6 -2
- data/app/models/camaleon_cms/nav_menu_item.rb +18 -8
- data/app/models/camaleon_cms/plugin.rb +4 -3
- data/app/models/camaleon_cms/post.rb +113 -27
- data/app/models/camaleon_cms/post_comment.rb +10 -6
- data/app/models/camaleon_cms/post_default.rb +42 -12
- data/app/models/camaleon_cms/post_relationship.rb +6 -4
- data/app/models/camaleon_cms/post_tag.rb +4 -3
- data/app/models/camaleon_cms/post_type.rb +22 -12
- data/app/models/camaleon_cms/site.rb +40 -28
- data/app/models/camaleon_cms/term_relationship.rb +10 -7
- data/app/models/camaleon_cms/term_taxonomy.rb +51 -5
- data/app/models/camaleon_cms/theme.rb +3 -3
- data/app/models/camaleon_cms/user.rb +17 -5
- data/app/models/camaleon_cms/user_role.rb +77 -4
- data/app/models/camaleon_cms/widget/assigned.rb +11 -6
- data/app/models/camaleon_cms/widget/main.rb +13 -7
- data/app/models/camaleon_cms/widget/sidebar.rb +3 -6
- data/app/models/camaleon_record.rb +123 -5
- data/app/models/concerns/camaleon_cms/categories_tags_for_posts.rb +20 -38
- data/app/models/concerns/camaleon_cms/common_relationships.rb +18 -5
- data/app/models/concerns/camaleon_cms/custom_fields_read.rb +115 -58
- data/app/models/concerns/camaleon_cms/metas.rb +32 -7
- data/app/models/concerns/camaleon_cms/normalize_attrs.rb +2 -8
- data/app/models/concerns/camaleon_cms/site_default_settings.rb +120 -16
- data/app/models/concerns/camaleon_cms/user_methods.rb +44 -19
- data/app/models/current_request.rb +23 -0
- data/app/uploaders/camaleon_cms_aws_uploader.rb +39 -11
- data/app/uploaders/camaleon_cms_local_uploader.rb +76 -19
- data/app/uploaders/camaleon_cms_uploader.rb +23 -10
- data/app/validators/camaleon_cms/post_uniq_validator.rb +21 -8
- data/app/validators/camaleon_cms/uniq_validator.rb +1 -1
- data/app/validators/camaleon_cms/user_url_validator.rb +215 -36
- data/app/views/camaleon_cms/admin/appearances/nav_menus/_left_menu_items.html.erb +2 -2
- data/app/views/camaleon_cms/admin/appearances/widgets/main/form.html.erb +1 -1
- data/app/views/camaleon_cms/admin/categories/index.html.erb +3 -3
- data/app/views/camaleon_cms/admin/comments/index.html.erb +2 -2
- data/app/views/camaleon_cms/admin/comments/list.html.erb +1 -1
- data/app/views/camaleon_cms/admin/installers/form.html.erb +5 -0
- data/app/views/camaleon_cms/admin/installers/welcome.html.erb +30 -6
- data/app/views/camaleon_cms/admin/plugins/_plugins_list.html.erb +2 -2
- data/app/views/camaleon_cms/admin/post_tags/index.html.erb +3 -3
- data/app/views/camaleon_cms/admin/posts/_sidebar.html.erb +2 -2
- data/app/views/camaleon_cms/admin/posts/form.html.erb +3 -2
- data/app/views/camaleon_cms/admin/posts/index.html.erb +6 -6
- data/app/views/camaleon_cms/admin/search.html.erb +1 -1
- data/app/views/camaleon_cms/admin/sessions/back_to_parent.html.erb +39 -0
- data/app/views/camaleon_cms/admin/sessions/logout_confirm.html.erb +27 -0
- data/app/views/camaleon_cms/admin/settings/_email_settings.html.erb +4 -1
- data/app/views/camaleon_cms/admin/settings/custom_fields/_get_items.html.erb +1 -1
- data/app/views/camaleon_cms/admin/settings/custom_fields/_render.html.erb +42 -6
- data/app/views/camaleon_cms/admin/settings/custom_fields/_render_category_simple.html.erb +1 -1
- data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_select_eval.html.erb +1 -1
- data/app/views/camaleon_cms/admin/settings/custom_fields/form.html.erb +5 -4
- data/app/views/camaleon_cms/admin/settings/custom_fields/index.html.erb +1 -1
- data/app/views/camaleon_cms/admin/settings/post_types/index.html.erb +1 -1
- data/app/views/camaleon_cms/admin/settings/shortcodes.html.erb +4 -4
- data/app/views/camaleon_cms/admin/settings/site.html.erb +1 -1
- data/app/views/camaleon_cms/admin/settings/sites/form.html.erb +1 -1
- data/app/views/camaleon_cms/admin/settings/sites/index.html.erb +1 -1
- data/app/views/camaleon_cms/admin/user_roles/form.html.erb +102 -7
- data/app/views/camaleon_cms/admin/user_roles/index.html.erb +1 -1
- data/app/views/camaleon_cms/admin/users/form.html.erb +8 -4
- data/app/views/camaleon_cms/admin/users/index.html.erb +2 -2
- data/app/views/camaleon_cms/default_theme/partials/_render_custom_field.html.erb +8 -2
- data/app/views/camaleon_cms/default_theme/sitemap.html.erb +1 -1
- data/app/views/camaleon_cms/default_theme/sitemap.xml.builder +1 -1
- data/app/views/layouts/camaleon_cms/admin/_flash_messages.html.erb +2 -2
- data/app/views/layouts/camaleon_cms/admin/_header.html.erb +1 -1
- data/config/initializers/action_view.rb +42 -5
- data/config/initializers/active_record_extension.rb +13 -27
- data/config/initializers/assets.rb +52 -23
- data/config/initializers/custom_initializers.rb +3 -3
- data/config/locales/camaleon_cms/admin/ar.yml +7 -2
- data/config/locales/camaleon_cms/admin/de.yml +7 -2
- data/config/locales/camaleon_cms/admin/en.yml +39 -2
- data/config/locales/camaleon_cms/admin/es.yml +7 -2
- data/config/locales/camaleon_cms/admin/fr.yml +7 -2
- data/config/locales/camaleon_cms/admin/it.yml +7 -2
- data/config/locales/camaleon_cms/admin/nl.yml +8 -2
- data/config/locales/camaleon_cms/admin/pt-BR.yml +7 -2
- data/config/locales/camaleon_cms/admin/pt.yml +7 -2
- data/config/locales/camaleon_cms/admin/ru.yml +7 -2
- data/config/locales/camaleon_cms/admin/uk.yml +7 -2
- data/config/locales/camaleon_cms/admin/zh-CH.yml +7 -2
- data/config/routes/admin.rb +33 -15
- data/config/routes/frontend.rb +21 -15
- data/db/migrate/20150611161134_post_table_into_utf8.rb +14 -14
- data/db/migrate/20150926095310_rename_column_posts.rb +3 -3
- data/db/migrate/20151212095328_add_confirm_token_to_users.rb +3 -3
- data/db/migrate/20160504155652_add_feature_to_posts.rb +1 -1
- data/db/migrate/20160504155653_move_first_name_of_users.rb +2 -2
- data/db/migrate/20160609121449_add_group_to_custom_field_values.rb +1 -1
- data/db/migrate/20161215202255_drop_user_relationship_table.rb +1 -1
- data/db/migrate/20180124132318_create_media.rb +1 -1
- data/db/migrate/20180704211100_adjust_field_length.rb +1 -1
- data/lib/camaleon_cms/assets_precompile.rb +86 -0
- data/lib/camaleon_cms/captcha_image_generation.rb +65 -0
- data/lib/camaleon_cms/content_security.rb +158 -0
- data/lib/camaleon_cms/engine.rb +47 -9
- data/lib/camaleon_cms/media_security_headers.rb +27 -0
- data/lib/camaleon_cms/setup_token.rb +69 -0
- data/lib/camaleon_cms/svg_content_checker.rb +123 -0
- data/lib/camaleon_cms/task_reporter.rb +14 -0
- data/lib/camaleon_cms/unsafe_markup.rb +207 -0
- data/lib/camaleon_cms/uploader_content_security.rb +248 -0
- data/lib/camaleon_cms/uploader_image_processing.rb +166 -0
- data/lib/camaleon_cms/uploader_path_security.rb +146 -0
- data/lib/camaleon_cms/uploader_pipeline.rb +350 -0
- data/lib/camaleon_cms/uploader_support.rb +86 -0
- data/lib/camaleon_cms/version.rb +1 -1
- data/lib/camaleon_cms.rb +11 -0
- data/lib/ext/hash.rb +28 -2
- data/lib/ext/string.rb +13 -8
- data/lib/ext/translator.rb +10 -2
- data/lib/generators/camaleon_cms/gem_plugin_template/app/controllers/plugins/my_plugin/admin_controller.rb +5 -1
- data/lib/generators/camaleon_cms/install_generator.rb +7 -4
- data/lib/generators/camaleon_cms/install_template/plugin_routes.rb +5 -12
- data/lib/generators/camaleon_cms/theme_generator.rb +5 -10
- data/lib/generators/camaleon_cms/theme_template/views/layouts/index.html.erb +3 -1
- data/lib/plugin_routes.rb +412 -368
- data/lib/tasks/camaleon_cms/camaleon_tasks.rake +2 -1
- data/lib/tasks/cross_site_field_groups.rake +74 -0
- data/lib/tasks/custom_fields_roles.rake +58 -0
- data/lib/tasks/orphaned_comments.rake +42 -0
- data/lib/tasks/private_upload_acls.rake +31 -0
- data/lib/tasks/site_custom_field_groups.rake +36 -0
- data/lib/tasks/unsafe_stored_content.rake +42 -0
- data/lib/tasks/unsafe_stored_uploads.rake +70 -0
- data/lib/tasks/user_field_groups.rake +27 -0
- metadata +185 -7
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<li>
|
|
7
7
|
<h3><a href="<%= ptype.the_url %>"><%= ptype.the_title %></a></h3>
|
|
8
8
|
<% if ptype.manage_categories? %>
|
|
9
|
-
<%= raw(cama_sitemap_cats_generator(ptype.the_categories)) %>
|
|
9
|
+
<%= raw(cama_sitemap_cats_generator(ptype.the_categories, @r)) %>
|
|
10
10
|
<% else %>
|
|
11
11
|
<ul>
|
|
12
12
|
<% ptype.the_posts.decorate.each do |post| next if @r[:skip_post_ids].include?(post.id) %>
|
|
@@ -57,7 +57,7 @@ xml.urlset 'xmlns' => 'https://www.sitemaps.org/schemas/sitemap/0.9' do
|
|
|
57
57
|
@r[:custom].each_value do |item|
|
|
58
58
|
xml.url do
|
|
59
59
|
xml.loc item[:url]
|
|
60
|
-
xml.lastmod item[:lastmod] || Date.
|
|
60
|
+
xml.lastmod item[:lastmod] || Date.current.to_s
|
|
61
61
|
xml.changefreq item[:changefreq] || 'monthly'
|
|
62
62
|
xml.priority item[:priority] || '0.5'
|
|
63
63
|
end
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
</div>
|
|
7
7
|
</div>
|
|
8
8
|
<% end %>
|
|
9
|
-
<% if
|
|
9
|
+
<% if flash[:info].present? %>
|
|
10
10
|
<div class="flash_messages">
|
|
11
11
|
<div class="alert alert-info">
|
|
12
12
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
|
13
|
-
<%=
|
|
13
|
+
<%= flash[:info] %>
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
16
16
|
<% end %>
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
<a href="<%= cama_admin_profile_edit_path %>" class="btn btn-primary cama_ajax_request"><%= t("camaleon_cms.admin.users.profile") %></a>
|
|
39
39
|
</div>
|
|
40
40
|
<div class="pull-right">
|
|
41
|
-
|
|
41
|
+
<%= button_to t("camaleon_cms.admin.logout.logout"), cama_admin_logout_path, method: :post, class: "btn btn-danger" %>
|
|
42
42
|
</div>
|
|
43
43
|
</li>
|
|
44
44
|
</ul>
|
|
@@ -7,11 +7,14 @@ module ActionView
|
|
|
7
7
|
# fix to add camaleon prefix to search partials and layouts
|
|
8
8
|
def find(name, prefixes = [], partial = false, keys = [], options = {})
|
|
9
9
|
if use_camaleon_partial_prefixes.present?
|
|
10
|
-
|
|
10
|
+
scoped_prefixes = cama_theme_scoped_prefixes(prefixes)
|
|
11
|
+
theme_scoped = scoped_prefixes.present?
|
|
12
|
+
prefixes = scoped_prefixes if theme_scoped
|
|
13
|
+
if !partial && prefixes.blank? && File.exist?(name) # fix for windows ==> render file: '....'
|
|
11
14
|
# puts "rendering specific file (render file: '....')"
|
|
12
15
|
else
|
|
13
|
-
prefixes = ['']
|
|
14
|
-
prefixes = (self.prefixes + prefixes).uniq if prefixes.is_a?(Array)
|
|
16
|
+
prefixes = [''] if prefixes.blank?
|
|
17
|
+
prefixes = (self.prefixes + prefixes).uniq if prefixes.is_a?(Array) && !theme_scoped
|
|
15
18
|
end
|
|
16
19
|
end
|
|
17
20
|
@view_paths.find(*cama_args_for_lookup(name, prefixes, partial, keys, options))
|
|
@@ -21,8 +24,11 @@ module ActionView
|
|
|
21
24
|
# fix to add camaleon prefixes on verify template exist
|
|
22
25
|
def exists?(name, prefixes = [], partial = false, keys = [], **options)
|
|
23
26
|
if use_camaleon_partial_prefixes.present?
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
scoped_prefixes = cama_theme_scoped_prefixes(prefixes)
|
|
28
|
+
theme_scoped = scoped_prefixes.present?
|
|
29
|
+
prefixes = scoped_prefixes if theme_scoped
|
|
30
|
+
prefixes = [''] if prefixes.blank?
|
|
31
|
+
prefixes = (prefixes + self.prefixes).uniq if prefixes.is_a?(Array) && !theme_scoped
|
|
26
32
|
end
|
|
27
33
|
@view_paths.exists?(*cama_args_for_lookup(name, prefixes, partial, keys, options))
|
|
28
34
|
end
|
|
@@ -43,6 +49,37 @@ module ActionView
|
|
|
43
49
|
[name, prefixes, partial || false, details, details_key, keys]
|
|
44
50
|
end
|
|
45
51
|
end
|
|
52
|
+
|
|
53
|
+
# Detects a lookup whose explicit prefixes are *entirely* scoped to the
|
|
54
|
+
# current (frontend) theme -- i.e. its `themes/<slug>/views...` prefixes
|
|
55
|
+
# and/or the gem `camaleon_cms/default_theme` fallback, and nothing else
|
|
56
|
+
# (e.g. a partial rendered from within a theme, or a theme preview). In
|
|
57
|
+
# that case the lookup is restricted to that theme and the global
|
|
58
|
+
# `self.prefixes` are NOT merged, so a different theme / per-site override
|
|
59
|
+
# does not leak in.
|
|
60
|
+
#
|
|
61
|
+
# When the explicit prefixes also include non-theme prefixes (e.g. a
|
|
62
|
+
# plugin front controller rendering its own `plugins/<name>/...`
|
|
63
|
+
# templates), it returns a blank list, signalling the caller to merge
|
|
64
|
+
# `self.prefixes` as before -- this keeps the plugin's own
|
|
65
|
+
# `plugins/<name>/views/...` lookup prefix reachable.
|
|
66
|
+
#
|
|
67
|
+
# Known limitation (regression audit M30, deliberately kept): an explicit
|
|
68
|
+
# `render prefixes:` whose list is *entirely* theme-scoped but whose target
|
|
69
|
+
# template actually lives under a controller prefix raises MissingTemplate,
|
|
70
|
+
# because `self.prefixes` are not merged in that case. Merging them would
|
|
71
|
+
# reopen the per-site-override / cross-theme leak this guard exists to close,
|
|
72
|
+
# and no stock or ecosystem caller hits it, so the isolation is kept.
|
|
73
|
+
def cama_theme_scoped_prefixes(prefixes)
|
|
74
|
+
theme = CurrentRequest.frontend_current_theme
|
|
75
|
+
slug = theme&.slug
|
|
76
|
+
return if slug.blank? || prefixes.blank? || !prefixes.is_a?(Array)
|
|
77
|
+
|
|
78
|
+
selected = prefixes.select do |prefix|
|
|
79
|
+
prefix.include?("themes/#{slug}/views") || prefix == 'camaleon_cms/default_theme'
|
|
80
|
+
end
|
|
81
|
+
selected if selected.length == prefixes.length
|
|
82
|
+
end
|
|
46
83
|
end
|
|
47
84
|
end
|
|
48
85
|
end
|
|
@@ -1,25 +1,3 @@
|
|
|
1
|
-
module ActiveRecordExtras
|
|
2
|
-
module Relation
|
|
3
|
-
extend ActiveSupport::Concern
|
|
4
|
-
|
|
5
|
-
module ClassMethods
|
|
6
|
-
def update_or_create(attributes = {})
|
|
7
|
-
assign_or_new(attributes).save
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def update_or_create!(attributes = {})
|
|
11
|
-
assign_or_new(attributes).save!
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def assign_or_new(attributes)
|
|
15
|
-
obj = first || new
|
|
16
|
-
obj.assign_attributes(attributes)
|
|
17
|
-
obj
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
1
|
ActiveRecord::Associations::CollectionProxy.class_eval do
|
|
24
2
|
# order a collection by custom fields
|
|
25
3
|
# Arguments:
|
|
@@ -28,9 +6,17 @@ ActiveRecord::Associations::CollectionProxy.class_eval do
|
|
|
28
6
|
# sample: CamaleonCms::Site.first.posts.sort_by_field("untitled-field-attributes", "desc")
|
|
29
7
|
def sort_by_field(key, order = 'ASC')
|
|
30
8
|
cfr_table = CamaleonCms::CustomFieldsRelationship.table_name
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
9
|
+
# Security (audit 2026-08-11, Tier-2 #8): sort_by_field is a public API themes/plugins reach as
|
|
10
|
+
# sort_by_field(key, params[:order]), so interpolating `order` straight into ORDER BY was an
|
|
11
|
+
# injection sink. Whitelist the direction to ASC/DESC and order by a quoted Arel column, so a
|
|
12
|
+
# hostile direction can neither append extra ORDER BY terms nor raise -- without relying on
|
|
13
|
+
# ActiveRecord's implicit raw-SQL guard. The whitelist reads the leading token so previously
|
|
14
|
+
# working spellings (' desc ', 'DESC NULLS LAST') keep their direction; punctuation sticks to
|
|
15
|
+
# the token ('DESC;...' != 'DESC'), so hostile strings still fail closed to ascending.
|
|
16
|
+
direction = order.to_s.strip[/\A\S+/]&.casecmp?('DESC') ? :desc : :asc
|
|
17
|
+
joins("LEFT OUTER JOIN #{cfr_table} ON #{cfr_table}.objectid = #{klass.table_name}.id").where(
|
|
18
|
+
"#{cfr_table}.custom_field_slug = ? and #{cfr_table}.object_class = ?", key, klass.name.parseCamaClass
|
|
19
|
+
).reorder(CamaleonCms::CustomFieldsRelationship.arel_table[:value].public_send(direction))
|
|
34
20
|
end
|
|
35
21
|
|
|
36
22
|
# Filter by custom field values
|
|
@@ -43,8 +29,8 @@ ActiveRecord::Associations::CollectionProxy.class_eval do
|
|
|
43
29
|
# .where("#{CamaleonCms::CustomFieldsRelationship.table_name}.value=?", "my_value_for_field")
|
|
44
30
|
def filter_by_field(key, args = {})
|
|
45
31
|
cfr_table = CamaleonCms::CustomFieldsRelationship.table_name
|
|
46
|
-
res = joins("LEFT OUTER JOIN #{cfr_table} ON #{cfr_table}.objectid = #{
|
|
47
|
-
"#{cfr_table}.custom_field_slug = ? and #{cfr_table}.object_class = ?", key,
|
|
32
|
+
res = joins("LEFT OUTER JOIN #{cfr_table} ON #{cfr_table}.objectid = #{klass.table_name}.id").where(
|
|
33
|
+
"#{cfr_table}.custom_field_slug = ? and #{cfr_table}.object_class = ?", key, klass.name.parseCamaClass
|
|
48
34
|
)
|
|
49
35
|
res = res.where("#{cfr_table}.value = ?", args[:value]) if args[:value]
|
|
50
36
|
res
|
|
@@ -1,34 +1,63 @@
|
|
|
1
1
|
# Be sure to restart your server when you modify this file.
|
|
2
2
|
|
|
3
3
|
# Version of your assets, change this if you want to expire all your assets.
|
|
4
|
-
Rails.application.config.assets.version = '1.
|
|
4
|
+
Rails.application.config.assets.version = '1.1'
|
|
5
5
|
|
|
6
6
|
Rails.application.config.tinymce.install = :copy
|
|
7
7
|
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
#
|
|
8
|
+
# TinyMCE editor icons in development.
|
|
9
|
+
#
|
|
10
|
+
# sprockets-rails >= 3.5 registers `Sprockets::Rails::AssetUrlProcessor`, a `text/css`
|
|
11
|
+
# post-processor that rewrites every relative `url(...)` reference to a digested asset
|
|
12
|
+
# path. TinyMCE's bundled skin (`tinymce/skins/lightgray/skin.min.css`) references its
|
|
13
|
+
# icon font with directory-relative urls such as `url('fonts/tinymce.woff')`. Sprockets
|
|
14
|
+
# resolves `url()` paths against the asset load roots (not the referencing file's own
|
|
15
|
+
# directory), so it cannot find `fonts/tinymce.woff` (its real logical path is
|
|
16
|
+
# `tinymce/skins/lightgray/fonts/...`) and rewrites it to an invalid root path
|
|
17
|
+
# (`/fonts/tinymce.woff`) which 404s, leaving the editor toolbar without icons.
|
|
18
|
+
#
|
|
19
|
+
# In production this never happens: `tinymce.install = :copy` ships the skin as raw static
|
|
20
|
+
# files under `public/assets`, bypassing Sprockets (and this processor) entirely. The bug
|
|
21
|
+
# only surfaces in environments that compile assets on the fly (development).
|
|
22
|
+
#
|
|
23
|
+
# We must NOT disable the processor globally: other stylesheets (e.g. Bootstrap, whose
|
|
24
|
+
# glyphicon @font-face urls are relative) rely on it to produce resolvable digested paths.
|
|
25
|
+
# Instead, swap it for a thin subclass that, for the TinyMCE skin only, first expands the
|
|
26
|
+
# skin's directory-relative font urls into full logical asset paths (prefixing them with the
|
|
27
|
+
# skin's own logical directory) before delegating to the original processor. The original
|
|
28
|
+
# then resolves and digests them correctly. Every other stylesheet is processed unchanged.
|
|
29
|
+
if defined?(Sprockets::Rails::AssetUrlProcessor) && Rails.application.config.assets.compile &&
|
|
30
|
+
Sprockets.respond_to?(:unregister_postprocessor) && Sprockets.respond_to?(:register_postprocessor)
|
|
31
|
+
class TinymceSkinSafeAssetUrlProcessor < Sprockets::Rails::AssetUrlProcessor
|
|
32
|
+
SKIN_MARKER = 'tinymce/skins/'.freeze
|
|
33
|
+
# Directory-relative `url(...)` references that are not absolute/external/data urls.
|
|
34
|
+
RELATIVE_URL = %r{url\(\s*["']?(?!(?:#|data|http|/))(?:\./)?(?<path>[^"'\s)]+)\s*["']?\)}
|
|
11
35
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
if dirname.start_with?('plugins/') || dirname.start_with?('themes/')
|
|
20
|
-
name = File.basename(path)
|
|
21
|
-
content_type = begin
|
|
22
|
-
MIME::Types.type_for(name).first.content_type
|
|
23
|
-
rescue StandardError
|
|
24
|
-
''
|
|
25
|
-
end
|
|
26
|
-
if (path =~ /\.(css|js|svg|ttf|woff|eot|swf|pdf|png|jpg|gif)\z/ ||
|
|
27
|
-
content_type.scan(%r{(javascript|image/|audio|video|font)}).any?) &&
|
|
28
|
-
!name.start_with?('_') && !path.include?('/views/')
|
|
29
|
-
res = true
|
|
36
|
+
def self.call(input)
|
|
37
|
+
filename = input[:filename].to_s
|
|
38
|
+
return super unless filename.include?(SKIN_MARKER)
|
|
39
|
+
|
|
40
|
+
logical_dir = File.dirname(filename[filename.index('tinymce/')..])
|
|
41
|
+
rewritten = input[:data].gsub(RELATIVE_URL) do
|
|
42
|
+
"url(#{logical_dir}/#{Regexp.last_match(:path)})"
|
|
30
43
|
end
|
|
44
|
+
super(input.merge(data: rewritten))
|
|
31
45
|
end
|
|
32
|
-
res
|
|
33
46
|
end
|
|
47
|
+
|
|
48
|
+
Sprockets.unregister_postprocessor('text/css', Sprockets::Rails::AssetUrlProcessor)
|
|
49
|
+
Sprockets.register_postprocessor('text/css', TinymceSkinSafeAssetUrlProcessor)
|
|
34
50
|
end
|
|
51
|
+
|
|
52
|
+
# Add additional assets to the asset load path
|
|
53
|
+
Rails.application.config.assets.precompile += %w[camaleon_cms/*]
|
|
54
|
+
# Rails.application.config.assets.precompile += %w( themes/*/assets/* )
|
|
55
|
+
|
|
56
|
+
# Precompile plugin/theme assets that live under app/apps/{plugins,themes}/.../assets.
|
|
57
|
+
# Rails' default precompile rules only cover app/assets, so without this plugin/theme
|
|
58
|
+
# assets are never declared as precompiled and `javascript_include_tag` /
|
|
59
|
+
# `stylesheet_link_tag` raise `AssetNotPrecompiledError` on Sprockets >= 4 when
|
|
60
|
+
# `unknown_asset_fallback` is disabled. Sprockets 4 only resolves exact logical paths
|
|
61
|
+
# (globs/procs are not honored by `asset_precompiled?`), so we enumerate them as strings.
|
|
62
|
+
require 'camaleon_cms/assets_precompile'
|
|
63
|
+
Rails.application.config.assets.precompile += CamaleonCms::AssetsPrecompile.logical_paths
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# load all custom initializers of plugins or themes
|
|
2
2
|
Rails.application.config.to_prepare do |_config|
|
|
3
3
|
PluginRoutes.all_apps.each do |ap|
|
|
4
|
-
next
|
|
4
|
+
next if ap['path'].blank?
|
|
5
5
|
|
|
6
6
|
f = File.join(ap['path'], 'config', 'initializer.rb')
|
|
7
|
-
|
|
7
|
+
load f if File.exist?(f)
|
|
8
8
|
|
|
9
9
|
f = File.join(ap['path'], 'config', 'custom_models.rb')
|
|
10
|
-
|
|
10
|
+
load f if File.exist?(f)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
# This block can be overridden in the app initializer to wrap the sleep and delete_file in an async job,
|
|
@@ -136,6 +136,7 @@ ar:
|
|
|
136
136
|
message:
|
|
137
137
|
success: 'Welcome!!!'
|
|
138
138
|
fail: 'Username or Password incorrect'
|
|
139
|
+
too_many_attempts: 'محاولات فاشلة كثيرة جدًا. يرجى المحاولة مرة أخرى لاحقًا.'
|
|
139
140
|
forgot_url_incorrect: 'URL incorrect'
|
|
140
141
|
forgot_expired: 'Reset expired.'
|
|
141
142
|
hello: 'Hello'
|
|
@@ -587,7 +588,10 @@ ar:
|
|
|
587
588
|
requires_different_email: 'Requires different email'
|
|
588
589
|
created_pending_validate_email: "The user has been created, please confirm your email"
|
|
589
590
|
new_photo: 'New Photo'
|
|
590
|
-
|
|
591
|
+
other_permissions: 'Others permissions'
|
|
592
|
+
select_eval_modal:
|
|
593
|
+
title: 'صلاحية خطيرة'
|
|
594
|
+
description: 'صلاحية select_eval تسمح بتنفيذ كود ديناميكي من خيارات الحقول المخصصة. تفعيلها قد يؤدي الى تنفيذ كود عشوائي، كشف البيانات، والسيطرة الكاملة على الموقع عند تقييم محتوى غير موثوق.'
|
|
591
595
|
profile: 'Profile'
|
|
592
596
|
slogan: 'Slogan'
|
|
593
597
|
type_contents: 'Type of Contents'
|
|
@@ -613,7 +617,7 @@ ar:
|
|
|
613
617
|
media: 'Permission to the midsection'
|
|
614
618
|
publish: 'You need permits Create or Edit, Edit Other, Edit, Publish, to enable this permission'
|
|
615
619
|
themes: 'Themes permission to section'
|
|
616
|
-
widgets: '
|
|
620
|
+
widgets: 'Allow editing widgets, including saving unsanitized code.'
|
|
617
621
|
menus: 'Permission to the Menu section'
|
|
618
622
|
plugins: 'Permission to the Plugins section'
|
|
619
623
|
users: 'Permission to create, edit, delete Users'
|
|
@@ -664,6 +668,7 @@ ar:
|
|
|
664
668
|
error_created: "No created sidebar."
|
|
665
669
|
error_updated: "No Update sidebar."
|
|
666
670
|
error_deleted: "Sidebar deleted."
|
|
671
|
+
warning: "Warning: Widgets can store unsanitized HTML and Javascript. Only enter code that you understand and trust."
|
|
667
672
|
intro:
|
|
668
673
|
profile: "In this place you can see your profile options."
|
|
669
674
|
content: "This block contains all content groups of your site. Each content can have different structure configured in settings => Content Groups"
|
|
@@ -135,6 +135,7 @@ de:
|
|
|
135
135
|
message:
|
|
136
136
|
success: 'Willkommen!!!'
|
|
137
137
|
fail: 'Benutzername oder Passwort falsch'
|
|
138
|
+
too_many_attempts: 'Zu viele fehlgeschlagene Versuche. Bitte versuchen Sie es später erneut.'
|
|
138
139
|
forgot_url_incorrect: 'URL inkorrekt'
|
|
139
140
|
forgot_expired: 'Resetfunktion abgelaufen'
|
|
140
141
|
hello: 'Hallo'
|
|
@@ -586,7 +587,10 @@ de:
|
|
|
586
587
|
requires_different_email: 'Erfordert eine andere Email'
|
|
587
588
|
created_pending_validate_email: 'Der Benutzer wurde erstellt, bitte bestätige deine Email.'
|
|
588
589
|
new_photo: 'Neues Bild'
|
|
589
|
-
|
|
590
|
+
other_permissions: 'Rechte Anderer'
|
|
591
|
+
select_eval_modal:
|
|
592
|
+
title: 'Gefahrliche Berechtigung'
|
|
593
|
+
description: 'Die Berechtigung select_eval erlaubt die Ausfuhrung von dynamischem Code aus Optionen benutzerdefinierter Felder. Das Aktivieren kann zu beliebiger Codeausfuhrung, Datenoffenlegung und einer vollstandigen Kompromittierung der Website fuhren, wenn nicht vertrauenswurdige Inhalte ausgewertet werden.'
|
|
590
594
|
profile: 'Profil'
|
|
591
595
|
slogan: 'Slogan'
|
|
592
596
|
type_contents: 'Art der Inhalte'
|
|
@@ -612,7 +616,7 @@ de:
|
|
|
612
616
|
media: 'Rechte für den Mittelbereich'
|
|
613
617
|
publish: 'Du benötigst die Rechte Erstellen oder Verarbeiten, Andere Bearbeiten, Bearbeiten, Veröffentlichen, um dieses Recht zu aktivieren'
|
|
614
618
|
themes: 'Recht für den Themes-Bereich'
|
|
615
|
-
widgets: 'Widgets
|
|
619
|
+
widgets: 'Ermöglichen Sie die Bearbeitung von Widgets, einschließlich des Speicherns von nicht bereinigtem Code.'
|
|
616
620
|
menus: 'Recht für den Menübereich'
|
|
617
621
|
plugins: 'Recht für den Plugin-Bereich'
|
|
618
622
|
users: 'Recht zum Erstellen, Bearbeiten und Löschen von Benutzern'
|
|
@@ -663,6 +667,7 @@ de:
|
|
|
663
667
|
error_created: 'Fehler beim Erstellen der Sidebar.'
|
|
664
668
|
error_updated: 'Fehler beim Aktualisieren der Sidebar.'
|
|
665
669
|
error_deleted: 'Fehler beim Löschen der Sidebar.'
|
|
670
|
+
warning: "Warnung: Widgets können nicht bereinigtes HTML und Javascript speichern. Geben Sie nur Code ein, den Sie verstehen und dem Sie vertrauen."
|
|
666
671
|
intro:
|
|
667
672
|
profile: 'Hier kannst du Einstellungen für dein Profil vornehmen.'
|
|
668
673
|
content: 'Dieser Block enthält die Inhaltsgruppen deiner Seite. Jeder Inhalt kann auf verschiedene Weise konfiguriert werden. Siehe Einstellungen => Inhaltsgruppen'
|
|
@@ -100,8 +100,12 @@ en:
|
|
|
100
100
|
custom_group_support_multiple: Support multiple groups
|
|
101
101
|
message:
|
|
102
102
|
custom_group_error: 'Error custom field group'
|
|
103
|
+
value_rejected_html: "The '%{slug}' field contains HTML that is not allowed for your role (for example scripts, event handlers or embeds). Remove it, or ask an administrator for the unfiltered-content permission."
|
|
104
|
+
value_rejected_uri: "The '%{slug}' field contains a script-capable URL (javascript:/data:), which is not allowed."
|
|
105
|
+
value_too_large: "The '%{slug}' field is too large to store; please shorten it."
|
|
103
106
|
custom_created: 'The custom field group has been created.'
|
|
104
107
|
custom_updated: 'The custom field group has been updated.'
|
|
108
|
+
invalid_placement: 'Select where to display this group. The selected target does not belong to this site.'
|
|
105
109
|
fields:
|
|
106
110
|
text_box: 'Text Box'
|
|
107
111
|
private_file: Private File
|
|
@@ -170,11 +174,19 @@ en:
|
|
|
170
174
|
subject_email: 'Reset your access'
|
|
171
175
|
send_mail_succes: 'Send email reset success.'
|
|
172
176
|
send_mail_error: 'Not found email address.'
|
|
177
|
+
password_reset_requested: 'If an account matches that email, a password reset link has been sent.'
|
|
173
178
|
invalid_caption: 'Invalid captcha'
|
|
174
179
|
email_not_validated: 'Email has not been validated.'
|
|
175
180
|
confirm_email_token_incorrect: 'URL incorrect'
|
|
176
181
|
confirm_email_token_expired: 'Confirm email URL expired'
|
|
177
182
|
confirm_email_success: 'Confirm email success!'
|
|
183
|
+
reauth_failed: 'Incorrect password. Please try again.'
|
|
184
|
+
too_many_attempts: 'Too many failed attempts. Please try again later.'
|
|
185
|
+
back_to_parent:
|
|
186
|
+
title: 'Return to your account'
|
|
187
|
+
instructions: 'You are currently working as %{impersonated}. Enter the password for your own account to return to it, or log out completely.'
|
|
188
|
+
submit: 'Return to my account'
|
|
189
|
+
logout: 'Log out completely'
|
|
178
190
|
personal_info: 'Personal info'
|
|
179
191
|
please_login: 'Please login'
|
|
180
192
|
reset_password: 'reset password'
|
|
@@ -200,6 +212,8 @@ en:
|
|
|
200
212
|
out: 'Out'
|
|
201
213
|
logout: 'Logout'
|
|
202
214
|
logout_html: 'Log <strong>Out</strong>?'
|
|
215
|
+
confirm_title: 'Log out?'
|
|
216
|
+
confirm_instructions: 'You are about to end your session. Continue?'
|
|
203
217
|
message:
|
|
204
218
|
closed: 'Session Closed'
|
|
205
219
|
media:
|
|
@@ -281,6 +295,8 @@ en:
|
|
|
281
295
|
label_required: 'Required Label'
|
|
282
296
|
placeholder_required: 'Required Placeholder'
|
|
283
297
|
message:
|
|
298
|
+
content_rejected: 'contains HTML that is not allowed for your role (for example scripts, event handlers or embeds). Remove it, or ask an administrator for the unfiltered-content permission.'
|
|
299
|
+
content_too_large: 'is too large to store; please shorten it.'
|
|
284
300
|
created: 'The %{post_type} has been created.'
|
|
285
301
|
updated: 'The %{post_type} has been updated.'
|
|
286
302
|
deleted: 'The %{post_type} has been removed.'
|
|
@@ -487,10 +503,24 @@ en:
|
|
|
487
503
|
message:
|
|
488
504
|
error: 'Not found site'
|
|
489
505
|
created: 'The site has been created.'
|
|
506
|
+
created_with_admin: 'Site created. New administrator password: %{password}. Change it after signing in.'
|
|
490
507
|
updated: 'The site has been updated.'
|
|
491
508
|
deleted: 'Correct Deleted'
|
|
492
509
|
enter_key_domain: 'Enter a key or a domain'
|
|
493
510
|
enter_key_domain_empty: 'Enter a key (site2) or a domain (my_domain.com). Key will be the name of your subdomain.'
|
|
511
|
+
installer:
|
|
512
|
+
setup_token: 'Setup token'
|
|
513
|
+
setup_token_hint: 'Required for remote installations; leave blank when installing locally. Printed in the server log and saved to tmp/camaleon_setup_token on first run.'
|
|
514
|
+
invalid_setup_token: 'A valid setup token is required to install. See the server log or tmp/camaleon_setup_token.'
|
|
515
|
+
welcome_title: 'Your site was created successfully.'
|
|
516
|
+
visit_frontend: 'Visit Frontend:'
|
|
517
|
+
visit_admin: 'Visit Admin panel'
|
|
518
|
+
here: 'Here.'
|
|
519
|
+
user_label: 'User:'
|
|
520
|
+
password_label: 'Password:'
|
|
521
|
+
copy: 'Copy'
|
|
522
|
+
copied: 'Copied!'
|
|
523
|
+
must_change_notice: 'Save this password now — it is shown only once. You will be asked to change it when you first sign in.'
|
|
494
524
|
signin:
|
|
495
525
|
message:
|
|
496
526
|
enter_username_password: 'You must enter a username and/or password'
|
|
@@ -628,6 +658,7 @@ en:
|
|
|
628
658
|
created: 'The user has been created.'
|
|
629
659
|
updated: 'The user has been updated.'
|
|
630
660
|
deleted: 'The user has been deleted.'
|
|
661
|
+
must_change_password: 'Please choose a new password before continuing.'
|
|
631
662
|
incorrect_old_password: 'Incorrect old password'
|
|
632
663
|
rol_error: 'Not found group user.'
|
|
633
664
|
rol_created: 'The user role has been created.'
|
|
@@ -640,7 +671,10 @@ en:
|
|
|
640
671
|
role_can_not_be_deleted: Role can not be deleted
|
|
641
672
|
user_can_not_delete_own_account: You cannot delete your own account
|
|
642
673
|
new_photo: 'New Photo'
|
|
643
|
-
|
|
674
|
+
other_permissions: 'Other permissions'
|
|
675
|
+
select_eval_modal:
|
|
676
|
+
title: 'Dangerous Permission'
|
|
677
|
+
description: 'The select_eval permission allows execution of dynamic code from custom field options. Enabling it can lead to arbitrary code execution, data exposure, and full site compromise if untrusted content is evaluated.'
|
|
644
678
|
profile: 'Profile'
|
|
645
679
|
slogan: 'Slogan'
|
|
646
680
|
type_contents: 'Type of Contents'
|
|
@@ -666,7 +700,7 @@ en:
|
|
|
666
700
|
media: 'Permission to the midsection'
|
|
667
701
|
publish: 'You need permits Create or Edit, Edit Other, Edit, Publish, to enable this permission'
|
|
668
702
|
themes: 'Themes permission to section'
|
|
669
|
-
widgets: '
|
|
703
|
+
widgets: 'Allow editing widgets, including saving unsanitized code.'
|
|
670
704
|
menus: 'Permission to the Menu section'
|
|
671
705
|
plugins: 'Permission to the Plugins section'
|
|
672
706
|
users: 'Permission to create, edit, delete Users'
|
|
@@ -707,6 +741,8 @@ en:
|
|
|
707
741
|
max: 'Please enter a value less than or equal to {0}.'
|
|
708
742
|
min: 'Please enter a value greater than or equal to {0}.'
|
|
709
743
|
username_alphanumeric: 'Username needs to start with an alphanumeric character'
|
|
744
|
+
https_only_url: 'Only HTTPS URLs are allowed'
|
|
745
|
+
path_traversal: 'URL path contains path traversal sequences'
|
|
710
746
|
widgets:
|
|
711
747
|
create_widget: 'Create Widget'
|
|
712
748
|
create_sidebar: 'Create Sidebar'
|
|
@@ -728,6 +764,7 @@ en:
|
|
|
728
764
|
error_created: "No created sidebar."
|
|
729
765
|
error_updated: "No Update sidebar."
|
|
730
766
|
error_deleted: "Sidebar deleted."
|
|
767
|
+
warning: "Warning: Widgets can store unsanitized HTML and Javascript. Only enter code that you understand and trust."
|
|
731
768
|
intro:
|
|
732
769
|
profile: "In this place you can see your profile options."
|
|
733
770
|
content: "This block contains all content groups of your site. Each content can have different structure configured in settings => Content Groups"
|
|
@@ -125,6 +125,7 @@ es:
|
|
|
125
125
|
message:
|
|
126
126
|
success: 'Bienvenido!!!'
|
|
127
127
|
fail: 'Usuario o contraseña incorrectos'
|
|
128
|
+
too_many_attempts: 'Demasiados intentos fallidos. Vuelva a intentarlo más tarde.'
|
|
128
129
|
forgot_url_incorrect: 'URL incorrecta'
|
|
129
130
|
forgot_expired: 'Restablecer caducado.'
|
|
130
131
|
hello: 'Hola'
|
|
@@ -561,7 +562,10 @@ es:
|
|
|
561
562
|
requires_different_email: 'Requiere diferente correo electrónico'
|
|
562
563
|
created_pending_validate_email: 'El usuario ha sido creado, por favor confirma tu email'
|
|
563
564
|
new_photo: 'Nueva Fotografía'
|
|
564
|
-
|
|
565
|
+
other_permissions: 'Otros permisos'
|
|
566
|
+
select_eval_modal:
|
|
567
|
+
title: 'Permiso peligroso'
|
|
568
|
+
description: 'El permiso select_eval permite ejecutar codigo dinamico desde opciones de campos personalizados. Al habilitarlo, puede provocar ejecucion arbitraria de codigo, exposicion de datos y compromiso total del sitio si se evalua contenido no confiable.'
|
|
565
569
|
profile: 'Perfil'
|
|
566
570
|
slogan: 'Eslogan'
|
|
567
571
|
type_contents: 'Tipo de Contenidos'
|
|
@@ -587,7 +591,7 @@ es:
|
|
|
587
591
|
media: 'Permiso a la seccion Media'
|
|
588
592
|
publish: 'Necesitas tener los permisos de Crear o Editar, Editar Otros, Editar Publicar, para habilitar este permiso'
|
|
589
593
|
themes: 'Permiso a la seccion Plantillas'
|
|
590
|
-
widgets: '
|
|
594
|
+
widgets: 'Permitir la edición de widgets, incluido el almacenamiento de código sin desinfectar.'
|
|
591
595
|
menus: 'Permiso a la seccion Menu'
|
|
592
596
|
plugins: 'Permiso a la seccion Plugins'
|
|
593
597
|
users: 'Permiso para crear, editar, eliminar Usuarios'
|
|
@@ -629,6 +633,7 @@ es:
|
|
|
629
633
|
error_created: 'No se ha creado el Widget.'
|
|
630
634
|
error_updated: 'No se ha actualizado el Widget.'
|
|
631
635
|
not_registered_widgets: 'No existen widgets registrados'
|
|
636
|
+
warning: "Advertencia: Los widgets pueden almacenar HTML y Javascript sin desinfectar. Ingrese solo el código que comprenda y en el que confíe."
|
|
632
637
|
appearances:
|
|
633
638
|
nav_menus:
|
|
634
639
|
menu_items:
|
|
@@ -128,6 +128,7 @@ fr:
|
|
|
128
128
|
message:
|
|
129
129
|
success: 'Bienvenue !!!'
|
|
130
130
|
fail: 'Nom ou mot de passe incorrect'
|
|
131
|
+
too_many_attempts: 'Trop de tentatives échouées. Veuillez réessayer plus tard.'
|
|
131
132
|
forgot_url_incorrect: 'URL incorrecte'
|
|
132
133
|
forgot_expired: 'Réinitialisation expirée.'
|
|
133
134
|
hello: 'Bonjour'
|
|
@@ -567,7 +568,10 @@ fr:
|
|
|
567
568
|
requires_different_email: 'Un email différent est requis'
|
|
568
569
|
created_pending_validate_email: "L'utilisateur a été créé, veuillez confirmer votre email"
|
|
569
570
|
new_photo: 'Nouvelle photo'
|
|
570
|
-
|
|
571
|
+
other_permissions: 'Autres permissions'
|
|
572
|
+
select_eval_modal:
|
|
573
|
+
title: 'Permission dangereuse'
|
|
574
|
+
description: 'La permission select_eval autorise l execution de code dynamique depuis les options des champs personnalises. Son activation peut entrainer l execution de code arbitraire, l exposition de donnees et la compromission complete du site si du contenu non fiable est evalue.'
|
|
571
575
|
profile: 'Profil'
|
|
572
576
|
slogan: 'Slogan'
|
|
573
577
|
type_contents: 'Type de contenus'
|
|
@@ -593,7 +597,7 @@ fr:
|
|
|
593
597
|
media: 'Permission pour la section média'
|
|
594
598
|
publish: 'Permissions Créer ou Editer, Editer autre, Editer, Publier, requises pour activer cette permission'
|
|
595
599
|
themes: 'Permission pour la section thèmes'
|
|
596
|
-
widgets:
|
|
600
|
+
widgets: "Autoriser la modification des widgets, y compris l'enregistrement de code non nettoyé."
|
|
597
601
|
menus: 'Permission pour la section menus'
|
|
598
602
|
plugins: 'Permission pour la section plugins'
|
|
599
603
|
users: 'Permission de créer, éditer et supprimer des utilisateurs'
|
|
@@ -644,6 +648,7 @@ fr:
|
|
|
644
648
|
error_created: "Sidebar non créée."
|
|
645
649
|
error_updated: "Sidebar non mise à jour."
|
|
646
650
|
error_deleted: "Sidebar supprimée."
|
|
651
|
+
warning: "Attention : les widgets peuvent stocker du HTML et du Javascript non nettoyés. Entrez uniquement du code que vous comprenez et auquel vous faites confiance."
|
|
647
652
|
intro:
|
|
648
653
|
profile: "Ici vous pouvez voir les options de votre profil."
|
|
649
654
|
content: "Ce bloc contient tout les groupes de contenu de votre site. Chaque contenu peut avoir une structure différente configurable via Paramètres => Groupes de contenu"
|
|
@@ -135,6 +135,7 @@ it:
|
|
|
135
135
|
message:
|
|
136
136
|
success: 'Benvenuto!!!'
|
|
137
137
|
fail: 'Username o Password errati'
|
|
138
|
+
too_many_attempts: 'Troppi tentativi falliti. Riprova più tardi.'
|
|
138
139
|
forgot_url_incorrect: 'URL errato'
|
|
139
140
|
forgot_expired: 'Reset scaduto.'
|
|
140
141
|
hello: 'Ciao'
|
|
@@ -565,7 +566,10 @@ it:
|
|
|
565
566
|
requires_different_username: 'Inserisci uno username diverso'
|
|
566
567
|
requires_different_email: 'Inserisci una email diversa'
|
|
567
568
|
new_photo: 'Nuova foto'
|
|
568
|
-
|
|
569
|
+
other_permissions: 'Altri permessi'
|
|
570
|
+
select_eval_modal:
|
|
571
|
+
title: 'Permesso pericoloso'
|
|
572
|
+
description: 'Il permesso select_eval consente l esecuzione di codice dinamico dalle opzioni dei campi personalizzati. Se abilitato, puo causare esecuzione arbitraria di codice, esposizione dei dati e compromissione completa del sito quando viene valutato contenuto non attendibile.'
|
|
569
573
|
profile: 'Profilo'
|
|
570
574
|
slogan: 'Slogan'
|
|
571
575
|
type_contents: 'Tipi di contenuti'
|
|
@@ -591,7 +595,7 @@ it:
|
|
|
591
595
|
media: 'Permesso per la midsection'
|
|
592
596
|
publish: 'Devi abilitare Crea o Modifica, Modifica Altro, Modifica, Pubblica, per abilitare questi permessi'
|
|
593
597
|
themes: 'Permessi per la sezione temi'
|
|
594
|
-
widgets: '
|
|
598
|
+
widgets: 'Consenti la modifica dei widget, incluso il salvataggio di codice non disinfettato.'
|
|
595
599
|
menus: 'Permessi per la sezione menù'
|
|
596
600
|
plugins: 'Permessi per la sezione plugin'
|
|
597
601
|
users: 'Permesso di creare, modificare e cancellare utenti'
|
|
@@ -633,3 +637,4 @@ it:
|
|
|
633
637
|
error_created: 'Widget non creato.'
|
|
634
638
|
error_updated: 'Widget non aggiornato.'
|
|
635
639
|
not_registered_widgets: 'Non ci sono widget registrati'
|
|
640
|
+
warning: "Attenzione: i widget possono memorizzare HTML e Javascript non sanificati. Inserisci solo il codice che comprendi e di cui ti fidi."
|
|
@@ -126,6 +126,7 @@ nl:
|
|
|
126
126
|
message:
|
|
127
127
|
success: 'Welkom!!!'
|
|
128
128
|
fail: 'Gebruikersnaam of wachtwoord incorrect'
|
|
129
|
+
too_many_attempts: 'Te veel mislukte pogingen. Probeer het later opnieuw.'
|
|
129
130
|
forgot_url_incorrect: 'URL incorrect'
|
|
130
131
|
forgot_expired: 'Reset verlopen.'
|
|
131
132
|
hello: 'Hallo'
|
|
@@ -563,7 +564,10 @@ nl:
|
|
|
563
564
|
requires_different_email: 'Andere e-mail verplicht'
|
|
564
565
|
created_pending_validate_email: "Gebruiker is aangemaakt, bevestig uw e-mail"
|
|
565
566
|
new_photo: 'Nieuwe foto'
|
|
566
|
-
|
|
567
|
+
other_permissions: 'Andere rechten'
|
|
568
|
+
select_eval_modal:
|
|
569
|
+
title: 'Gevaarlijke toestemming'
|
|
570
|
+
description: 'De toestemming select_eval staat het uitvoeren van dynamische code toe vanuit opties van aangepaste velden. Inschakelen kan leiden tot willekeurige code-uitvoering, blootstelling van gegevens en volledige compromittering van de site als niet-vertrouwde inhoud wordt ge-evalueerd.'
|
|
567
571
|
profile: 'Profiel'
|
|
568
572
|
slogan: 'Slogan'
|
|
569
573
|
type_contents: 'Type inhoud'
|
|
@@ -589,7 +593,7 @@ nl:
|
|
|
589
593
|
media: 'Toegang tot media'
|
|
590
594
|
publish: 'Je hebt de volgende rechten toevoegen en bewerken, bewerk andere, bewerk gepubliceerd nodig om dit aan te passen'
|
|
591
595
|
themes: "Toegang tot thema's"
|
|
592
|
-
widgets: '
|
|
596
|
+
widgets: 'Sta het bewerken van widgets toe, inclusief het opslaan van niet-opgeschoonde code.'
|
|
593
597
|
menus: "Toegang tot menu's"
|
|
594
598
|
plugins: 'Toegang tot plugins'
|
|
595
599
|
users: 'Rechten om gebruikers aan te maken, te bewerken of te verwijderen'
|
|
@@ -640,6 +644,8 @@ nl:
|
|
|
640
644
|
error_created: "FOUT! Sidebar is niet aangemaakt."
|
|
641
645
|
error_updated: "FOUT! Sidebar is niet bijgewerkt."
|
|
642
646
|
error_deleted: "Sidebar verwijderd."
|
|
647
|
+
warning: "Waarschuwing: Widgets kunnen niet-opgeschoonde HTML en Javascript opslaan. Voer alleen code in die u begrijpt en vertrouwt."
|
|
648
|
+
|
|
643
649
|
intro:
|
|
644
650
|
profile: "Hier kun je profiel opties bekijken."
|
|
645
651
|
content: "Dit blok bevat alle inhoud types van uw site. Elk inhoud type kan in een andere structuur geconfigureerd worden in instellingen => Inhoud type's hebben"
|