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.
Files changed (241) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -9
  3. data/Rakefile +3 -16
  4. data/app/apps/plugins/attack/admin_controller.rb +9 -6
  5. data/app/apps/plugins/attack/attack_helper.rb +35 -25
  6. data/app/apps/plugins/authoring_post/authoring_post_helper.rb +23 -16
  7. data/app/apps/plugins/front_cache/admin_controller.rb +16 -10
  8. data/app/apps/plugins/front_cache/config/initializer.rb +1 -1
  9. data/app/apps/plugins/front_cache/front_cache_helper.rb +57 -24
  10. data/app/apps/plugins/visibility_post/config/config.json +1 -0
  11. data/app/apps/plugins/visibility_post/config/routes_front.txt +1 -0
  12. data/app/apps/plugins/visibility_post/front_controller.rb +23 -0
  13. data/app/apps/plugins/visibility_post/visibility_post_helper.rb +141 -70
  14. data/app/apps/themes/camaleon_first/main_helper.rb +18 -12
  15. data/app/apps/themes/default/assets/css/style.css.scss +24 -0
  16. data/app/apps/themes/default/assets/genericons/genericons.css +3 -8
  17. data/app/apps/themes/default/default_helper.rb +2 -1
  18. data/app/apps/themes/default/views/category.html.erb +1 -1
  19. data/app/apps/themes/default/views/layouts/index.html.erb +3 -1
  20. data/app/apps/themes/default/views/post_tag.html.erb +1 -1
  21. data/app/apps/themes/default/views/post_type.html.erb +1 -1
  22. data/app/apps/themes/default/views/search.html.erb +1 -1
  23. data/app/apps/themes/new/assets/css/styles.css.scss +24 -0
  24. data/app/apps/themes/new/custom_helper.rb +5 -9
  25. data/app/apps/themes/new/views/category.html.erb +1 -1
  26. data/app/apps/themes/new/views/layouts/_header.html.erb +3 -1
  27. data/app/apps/themes/new/views/post_tag.html.erb +1 -1
  28. data/app/apps/themes/new/views/post_type.html.erb +1 -1
  29. data/app/apps/themes/new/views/search.html.erb +1 -1
  30. data/app/assets/javascripts/camaleon_cms/admin/_data.js +16 -0
  31. data/app/assets/javascripts/camaleon_cms/admin/_post.js +5 -2
  32. data/app/assets/javascripts/camaleon_cms/admin/nav_menu.js +14 -3
  33. data/app/assets/javascripts/camaleon_cms/admin/uploader/_media_manager.js +5 -0
  34. data/app/controllers/camaleon_cms/admin/appearances/nav_menus_controller.rb +29 -10
  35. data/app/controllers/camaleon_cms/admin/appearances/themes_controller.rb +8 -5
  36. data/app/controllers/camaleon_cms/admin/appearances/widgets/assign_controller.rb +9 -2
  37. data/app/controllers/camaleon_cms/admin/appearances/widgets/main_controller.rb +4 -3
  38. data/app/controllers/camaleon_cms/admin/appearances/widgets/sidebar_controller.rb +2 -2
  39. data/app/controllers/camaleon_cms/admin/categories_controller.rb +27 -8
  40. data/app/controllers/camaleon_cms/admin/comments_controller.rb +0 -1
  41. data/app/controllers/camaleon_cms/admin/installers_controller.rb +32 -1
  42. data/app/controllers/camaleon_cms/admin/media_controller.rb +84 -19
  43. data/app/controllers/camaleon_cms/admin/plugins_controller.rb +1 -3
  44. data/app/controllers/camaleon_cms/admin/post_tags_controller.rb +15 -6
  45. data/app/controllers/camaleon_cms/admin/posts/drafts_controller.rb +40 -11
  46. data/app/controllers/camaleon_cms/admin/posts_controller.rb +58 -22
  47. data/app/controllers/camaleon_cms/admin/sessions_controller.rb +238 -45
  48. data/app/controllers/camaleon_cms/admin/settings/custom_fields_controller.rb +103 -18
  49. data/app/controllers/camaleon_cms/admin/settings/post_types_controller.rb +17 -5
  50. data/app/controllers/camaleon_cms/admin/settings/sites_controller.rb +33 -7
  51. data/app/controllers/camaleon_cms/admin/settings_controller.rb +11 -6
  52. data/app/controllers/camaleon_cms/admin/user_roles_controller.rb +9 -7
  53. data/app/controllers/camaleon_cms/admin/users_controller.rb +89 -18
  54. data/app/controllers/camaleon_cms/admin_controller.rb +144 -26
  55. data/app/controllers/camaleon_cms/apps/plugins_admin_controller.rb +5 -0
  56. data/app/controllers/camaleon_cms/camaleon_controller.rb +37 -92
  57. data/app/controllers/camaleon_cms/frontend_controller.rb +140 -70
  58. data/app/controllers/concerns/camaleon_cms/admin/custom_fields_concern.rb +44 -0
  59. data/app/controllers/concerns/camaleon_cms/frontend_concern.rb +46 -17
  60. data/app/controllers/concerns/camaleon_cms/frontend_visited_state_concern.rb +72 -0
  61. data/app/controllers/concerns/camaleon_cms/hook_lifecycle_concern.rb +104 -0
  62. data/app/controllers/concerns/camaleon_cms/request_context_concern.rb +113 -0
  63. data/app/controllers/concerns/camaleon_cms/runtime_admin_menu_concern.rb +237 -0
  64. data/app/controllers/concerns/camaleon_cms/runtime_captcha_image_concern.rb +13 -0
  65. data/app/controllers/concerns/camaleon_cms/runtime_html_content_concern.rb +143 -0
  66. data/app/controllers/concerns/camaleon_cms/runtime_shortcode_theme_concern.rb +246 -0
  67. data/app/controllers/concerns/camaleon_cms/runtime_state_concern.rb +13 -0
  68. data/app/controllers/concerns/camaleon_cms/runtime_uploader_concern.rb +54 -0
  69. data/app/controllers/concerns/camaleon_cms/session_captcha_runtime_concern.rb +19 -0
  70. data/app/controllers/concerns/camaleon_cms/session_runtime_concern.rb +40 -0
  71. data/app/decorators/camaleon_cms/application_decorator.rb +11 -8
  72. data/app/decorators/camaleon_cms/category_decorator.rb +3 -2
  73. data/app/decorators/camaleon_cms/post_comment_decorator.rb +13 -5
  74. data/app/decorators/camaleon_cms/post_decorator.rb +67 -51
  75. data/app/decorators/camaleon_cms/post_type_decorator.rb +1 -1
  76. data/app/decorators/camaleon_cms/site_decorator.rb +29 -23
  77. data/app/decorators/camaleon_cms/term_taxonomy_decorator.rb +21 -10
  78. data/app/decorators/camaleon_cms/theme_decorator.rb +3 -3
  79. data/app/decorators/camaleon_cms/user_decorator.rb +26 -5
  80. data/app/helpers/camaleon_cms/admin/application_helper.rb +21 -24
  81. data/app/helpers/camaleon_cms/admin/breadcrumb_helper.rb +1 -1
  82. data/app/helpers/camaleon_cms/admin/custom_fields_helper.rb +24 -23
  83. data/app/helpers/camaleon_cms/admin/menus_helper.rb +249 -139
  84. data/app/helpers/camaleon_cms/admin/post_type_helper.rb +51 -31
  85. data/app/helpers/camaleon_cms/camaleon_helper.rb +31 -39
  86. data/app/helpers/camaleon_cms/captcha_helper.rb +73 -53
  87. data/app/helpers/camaleon_cms/comment_helper.rb +87 -41
  88. data/app/helpers/camaleon_cms/content_helper.rb +13 -6
  89. data/app/helpers/camaleon_cms/email_helper.rb +7 -3
  90. data/app/helpers/camaleon_cms/frontend/content_select_helper.rb +34 -20
  91. data/app/helpers/camaleon_cms/frontend/nav_menu_helper.rb +144 -67
  92. data/app/helpers/camaleon_cms/frontend/seo_helper.rb +39 -28
  93. data/app/helpers/camaleon_cms/frontend/site_helper.rb +32 -12
  94. data/app/helpers/camaleon_cms/hooks_helper.rb +14 -4
  95. data/app/helpers/camaleon_cms/html_helper.rb +73 -38
  96. data/app/helpers/camaleon_cms/plugins_helper.rb +23 -24
  97. data/app/helpers/camaleon_cms/session_helper.rb +195 -39
  98. data/app/helpers/camaleon_cms/short_code_helper.rb +181 -85
  99. data/app/helpers/camaleon_cms/site_helper.rb +43 -9
  100. data/app/helpers/camaleon_cms/theme_helper.rb +35 -19
  101. data/app/helpers/camaleon_cms/uploader_helper.rb +19 -422
  102. data/app/helpers/camaleon_cms/user_roles_helper.rb +5 -4
  103. data/app/mailers/camaleon_cms/html_mailer.rb +4 -4
  104. data/app/models/camaleon_cms/ability.rb +65 -105
  105. data/app/models/camaleon_cms/category.rb +7 -5
  106. data/app/models/camaleon_cms/custom_field.rb +29 -6
  107. data/app/models/camaleon_cms/custom_field_group.rb +75 -21
  108. data/app/models/camaleon_cms/custom_fields_relationship.rb +133 -2
  109. data/app/models/camaleon_cms/media.rb +8 -2
  110. data/app/models/camaleon_cms/meta.rb +2 -2
  111. data/app/models/camaleon_cms/nav_menu.rb +6 -2
  112. data/app/models/camaleon_cms/nav_menu_item.rb +18 -8
  113. data/app/models/camaleon_cms/plugin.rb +4 -3
  114. data/app/models/camaleon_cms/post.rb +113 -27
  115. data/app/models/camaleon_cms/post_comment.rb +10 -6
  116. data/app/models/camaleon_cms/post_default.rb +42 -12
  117. data/app/models/camaleon_cms/post_relationship.rb +6 -4
  118. data/app/models/camaleon_cms/post_tag.rb +4 -3
  119. data/app/models/camaleon_cms/post_type.rb +22 -12
  120. data/app/models/camaleon_cms/site.rb +40 -28
  121. data/app/models/camaleon_cms/term_relationship.rb +10 -7
  122. data/app/models/camaleon_cms/term_taxonomy.rb +51 -5
  123. data/app/models/camaleon_cms/theme.rb +3 -3
  124. data/app/models/camaleon_cms/user.rb +17 -5
  125. data/app/models/camaleon_cms/user_role.rb +77 -4
  126. data/app/models/camaleon_cms/widget/assigned.rb +11 -6
  127. data/app/models/camaleon_cms/widget/main.rb +13 -7
  128. data/app/models/camaleon_cms/widget/sidebar.rb +3 -6
  129. data/app/models/camaleon_record.rb +123 -5
  130. data/app/models/concerns/camaleon_cms/categories_tags_for_posts.rb +20 -38
  131. data/app/models/concerns/camaleon_cms/common_relationships.rb +18 -5
  132. data/app/models/concerns/camaleon_cms/custom_fields_read.rb +115 -58
  133. data/app/models/concerns/camaleon_cms/metas.rb +32 -7
  134. data/app/models/concerns/camaleon_cms/normalize_attrs.rb +2 -8
  135. data/app/models/concerns/camaleon_cms/site_default_settings.rb +120 -16
  136. data/app/models/concerns/camaleon_cms/user_methods.rb +44 -19
  137. data/app/models/current_request.rb +23 -0
  138. data/app/uploaders/camaleon_cms_aws_uploader.rb +39 -11
  139. data/app/uploaders/camaleon_cms_local_uploader.rb +76 -19
  140. data/app/uploaders/camaleon_cms_uploader.rb +23 -10
  141. data/app/validators/camaleon_cms/post_uniq_validator.rb +21 -8
  142. data/app/validators/camaleon_cms/uniq_validator.rb +1 -1
  143. data/app/validators/camaleon_cms/user_url_validator.rb +215 -36
  144. data/app/views/camaleon_cms/admin/appearances/nav_menus/_left_menu_items.html.erb +2 -2
  145. data/app/views/camaleon_cms/admin/appearances/widgets/main/form.html.erb +1 -1
  146. data/app/views/camaleon_cms/admin/categories/index.html.erb +3 -3
  147. data/app/views/camaleon_cms/admin/comments/index.html.erb +2 -2
  148. data/app/views/camaleon_cms/admin/comments/list.html.erb +1 -1
  149. data/app/views/camaleon_cms/admin/installers/form.html.erb +5 -0
  150. data/app/views/camaleon_cms/admin/installers/welcome.html.erb +30 -6
  151. data/app/views/camaleon_cms/admin/plugins/_plugins_list.html.erb +2 -2
  152. data/app/views/camaleon_cms/admin/post_tags/index.html.erb +3 -3
  153. data/app/views/camaleon_cms/admin/posts/_sidebar.html.erb +2 -2
  154. data/app/views/camaleon_cms/admin/posts/form.html.erb +3 -2
  155. data/app/views/camaleon_cms/admin/posts/index.html.erb +6 -6
  156. data/app/views/camaleon_cms/admin/search.html.erb +1 -1
  157. data/app/views/camaleon_cms/admin/sessions/back_to_parent.html.erb +39 -0
  158. data/app/views/camaleon_cms/admin/sessions/logout_confirm.html.erb +27 -0
  159. data/app/views/camaleon_cms/admin/settings/_email_settings.html.erb +4 -1
  160. data/app/views/camaleon_cms/admin/settings/custom_fields/_get_items.html.erb +1 -1
  161. data/app/views/camaleon_cms/admin/settings/custom_fields/_render.html.erb +42 -6
  162. data/app/views/camaleon_cms/admin/settings/custom_fields/_render_category_simple.html.erb +1 -1
  163. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_select_eval.html.erb +1 -1
  164. data/app/views/camaleon_cms/admin/settings/custom_fields/form.html.erb +5 -4
  165. data/app/views/camaleon_cms/admin/settings/custom_fields/index.html.erb +1 -1
  166. data/app/views/camaleon_cms/admin/settings/post_types/index.html.erb +1 -1
  167. data/app/views/camaleon_cms/admin/settings/shortcodes.html.erb +4 -4
  168. data/app/views/camaleon_cms/admin/settings/site.html.erb +1 -1
  169. data/app/views/camaleon_cms/admin/settings/sites/form.html.erb +1 -1
  170. data/app/views/camaleon_cms/admin/settings/sites/index.html.erb +1 -1
  171. data/app/views/camaleon_cms/admin/user_roles/form.html.erb +102 -7
  172. data/app/views/camaleon_cms/admin/user_roles/index.html.erb +1 -1
  173. data/app/views/camaleon_cms/admin/users/form.html.erb +8 -4
  174. data/app/views/camaleon_cms/admin/users/index.html.erb +2 -2
  175. data/app/views/camaleon_cms/default_theme/partials/_render_custom_field.html.erb +8 -2
  176. data/app/views/camaleon_cms/default_theme/sitemap.html.erb +1 -1
  177. data/app/views/camaleon_cms/default_theme/sitemap.xml.builder +1 -1
  178. data/app/views/layouts/camaleon_cms/admin/_flash_messages.html.erb +2 -2
  179. data/app/views/layouts/camaleon_cms/admin/_header.html.erb +1 -1
  180. data/config/initializers/action_view.rb +42 -5
  181. data/config/initializers/active_record_extension.rb +13 -27
  182. data/config/initializers/assets.rb +52 -23
  183. data/config/initializers/custom_initializers.rb +3 -3
  184. data/config/locales/camaleon_cms/admin/ar.yml +7 -2
  185. data/config/locales/camaleon_cms/admin/de.yml +7 -2
  186. data/config/locales/camaleon_cms/admin/en.yml +39 -2
  187. data/config/locales/camaleon_cms/admin/es.yml +7 -2
  188. data/config/locales/camaleon_cms/admin/fr.yml +7 -2
  189. data/config/locales/camaleon_cms/admin/it.yml +7 -2
  190. data/config/locales/camaleon_cms/admin/nl.yml +8 -2
  191. data/config/locales/camaleon_cms/admin/pt-BR.yml +7 -2
  192. data/config/locales/camaleon_cms/admin/pt.yml +7 -2
  193. data/config/locales/camaleon_cms/admin/ru.yml +7 -2
  194. data/config/locales/camaleon_cms/admin/uk.yml +7 -2
  195. data/config/locales/camaleon_cms/admin/zh-CH.yml +7 -2
  196. data/config/routes/admin.rb +33 -15
  197. data/config/routes/frontend.rb +21 -15
  198. data/db/migrate/20150611161134_post_table_into_utf8.rb +14 -14
  199. data/db/migrate/20150926095310_rename_column_posts.rb +3 -3
  200. data/db/migrate/20151212095328_add_confirm_token_to_users.rb +3 -3
  201. data/db/migrate/20160504155652_add_feature_to_posts.rb +1 -1
  202. data/db/migrate/20160504155653_move_first_name_of_users.rb +2 -2
  203. data/db/migrate/20160609121449_add_group_to_custom_field_values.rb +1 -1
  204. data/db/migrate/20161215202255_drop_user_relationship_table.rb +1 -1
  205. data/db/migrate/20180124132318_create_media.rb +1 -1
  206. data/db/migrate/20180704211100_adjust_field_length.rb +1 -1
  207. data/lib/camaleon_cms/assets_precompile.rb +86 -0
  208. data/lib/camaleon_cms/captcha_image_generation.rb +65 -0
  209. data/lib/camaleon_cms/content_security.rb +158 -0
  210. data/lib/camaleon_cms/engine.rb +47 -9
  211. data/lib/camaleon_cms/media_security_headers.rb +27 -0
  212. data/lib/camaleon_cms/setup_token.rb +69 -0
  213. data/lib/camaleon_cms/svg_content_checker.rb +123 -0
  214. data/lib/camaleon_cms/task_reporter.rb +14 -0
  215. data/lib/camaleon_cms/unsafe_markup.rb +207 -0
  216. data/lib/camaleon_cms/uploader_content_security.rb +248 -0
  217. data/lib/camaleon_cms/uploader_image_processing.rb +166 -0
  218. data/lib/camaleon_cms/uploader_path_security.rb +146 -0
  219. data/lib/camaleon_cms/uploader_pipeline.rb +350 -0
  220. data/lib/camaleon_cms/uploader_support.rb +86 -0
  221. data/lib/camaleon_cms/version.rb +1 -1
  222. data/lib/camaleon_cms.rb +11 -0
  223. data/lib/ext/hash.rb +28 -2
  224. data/lib/ext/string.rb +13 -8
  225. data/lib/ext/translator.rb +10 -2
  226. data/lib/generators/camaleon_cms/gem_plugin_template/app/controllers/plugins/my_plugin/admin_controller.rb +5 -1
  227. data/lib/generators/camaleon_cms/install_generator.rb +7 -4
  228. data/lib/generators/camaleon_cms/install_template/plugin_routes.rb +5 -12
  229. data/lib/generators/camaleon_cms/theme_generator.rb +5 -10
  230. data/lib/generators/camaleon_cms/theme_template/views/layouts/index.html.erb +3 -1
  231. data/lib/plugin_routes.rb +412 -368
  232. data/lib/tasks/camaleon_cms/camaleon_tasks.rake +2 -1
  233. data/lib/tasks/cross_site_field_groups.rake +74 -0
  234. data/lib/tasks/custom_fields_roles.rake +58 -0
  235. data/lib/tasks/orphaned_comments.rake +42 -0
  236. data/lib/tasks/private_upload_acls.rake +31 -0
  237. data/lib/tasks/site_custom_field_groups.rake +36 -0
  238. data/lib/tasks/unsafe_stored_content.rake +42 -0
  239. data/lib/tasks/unsafe_stored_uploads.rake +70 -0
  240. data/lib/tasks/user_field_groups.rake +27 -0
  241. 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.today.to_s
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 params[:info] %>
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">&times;</span></button>
13
- <%= raw(params[:info]) %>
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
- <a href="<%= cama_admin_logout_path %>" class="btn btn-danger"><%= t("camaleon_cms.admin.logout.logout") %></a>
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
- if !partial && !prefixes.present? && File.exist?(name) # fix for windows ==> render file: '....'
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 = [''] unless prefixes.present?
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
- prefixes = [''] unless prefixes.present?
25
- prefixes = (prefixes + self.prefixes).uniq if prefixes.is_a?(Array)
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
- joins("LEFT OUTER JOIN #{cfr_table} ON #{cfr_table}.objectid = #{build.class.table_name}.id").where(
32
- "#{cfr_table}.custom_field_slug = ? and #{cfr_table}.object_class = ?", key, build.class.name.parseCamaClass
33
- ).reorder("#{cfr_table}.value #{order}")
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 = #{build.class.table_name}.id").where(
47
- "#{cfr_table}.custom_field_slug = ? and #{cfr_table}.object_class = ?", key, build.class.name.parseCamaClass
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.0'
4
+ Rails.application.config.assets.version = '1.1'
5
5
 
6
6
  Rails.application.config.tinymce.install = :copy
7
7
 
8
- # Add additional assets to the asset load path
9
- Rails.application.config.assets.precompile += %w[camaleon_cms/*]
10
- # Rails.application.config.assets.precompile += %w( themes/*/assets/* )
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
- # This will precompile any assets, not just JavaScript (.js, .swf, .css, .scss)
13
-
14
- sprockets_3 = !Sprockets.const_defined?(:BabelProcessor)
15
- if sprockets_3
16
- Rails.application.config.assets.precompile << proc do |path|
17
- res = false
18
- dirname = File.dirname(path)
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 unless ap['path'].present?
4
+ next if ap['path'].blank?
5
5
 
6
6
  f = File.join(ap['path'], 'config', 'initializer.rb')
7
- eval(File.read(f)) if File.exist?(f)
7
+ load f if File.exist?(f)
8
8
 
9
9
  f = File.join(ap['path'], 'config', 'custom_models.rb')
10
- eval(File.read(f)) if File.exist?(f)
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
- others_permissions: 'Others permissions'
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: 'Widgets permission to section'
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
- others_permissions: 'Rechte Anderer'
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-Recht für den Bereich'
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
- others_permissions: 'Others permissions'
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: 'Widgets permission to section'
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
- others_permissions: 'Otros permisos'
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: 'Permiso a la seccion 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
- others_permissions: 'Autres permissions'
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: 'Permission pour la section 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
- others_permissions: 'Altri permessi'
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: 'Permessi per la sezione widget'
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
- others_permissions: 'Andere rechten'
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: 'Toegang tot 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"