camaleon_cms 2.9.0 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -5
  3. data/app/apps/plugins/front_cache/admin_controller.rb +1 -0
  4. data/app/apps/plugins/front_cache/front_cache_helper.rb +23 -14
  5. data/app/apps/plugins/visibility_post/visibility_post_helper.rb +1 -1
  6. data/app/apps/themes/default/views/category.html.erb +1 -1
  7. data/app/apps/themes/default/views/post_tag.html.erb +1 -1
  8. data/app/apps/themes/default/views/post_type.html.erb +1 -1
  9. data/app/apps/themes/default/views/search.html.erb +1 -1
  10. data/app/apps/themes/new/views/category.html.erb +1 -1
  11. data/app/apps/themes/new/views/post_tag.html.erb +1 -1
  12. data/app/apps/themes/new/views/post_type.html.erb +1 -1
  13. data/app/apps/themes/new/views/search.html.erb +1 -1
  14. data/app/controllers/camaleon_cms/admin/appearances/nav_menus_controller.rb +22 -5
  15. data/app/controllers/camaleon_cms/admin/appearances/widgets/assign_controller.rb +4 -2
  16. data/app/controllers/camaleon_cms/admin/appearances/widgets/main_controller.rb +3 -3
  17. data/app/controllers/camaleon_cms/admin/appearances/widgets/sidebar_controller.rb +2 -2
  18. data/app/controllers/camaleon_cms/admin/categories_controller.rb +9 -5
  19. data/app/controllers/camaleon_cms/admin/media_controller.rb +18 -5
  20. data/app/controllers/camaleon_cms/admin/post_tags_controller.rb +7 -4
  21. data/app/controllers/camaleon_cms/admin/posts/drafts_controller.rb +1 -1
  22. data/app/controllers/camaleon_cms/admin/posts_controller.rb +7 -4
  23. data/app/controllers/camaleon_cms/admin/sessions_controller.rb +2 -2
  24. data/app/controllers/camaleon_cms/admin/settings/custom_fields_controller.rb +33 -11
  25. data/app/controllers/camaleon_cms/admin/settings/post_types_controller.rb +13 -4
  26. data/app/controllers/camaleon_cms/admin/settings/sites_controller.rb +7 -4
  27. data/app/controllers/camaleon_cms/admin/settings_controller.rb +7 -4
  28. data/app/controllers/camaleon_cms/admin/user_roles_controller.rb +2 -2
  29. data/app/controllers/camaleon_cms/admin/users_controller.rb +23 -14
  30. data/app/controllers/camaleon_cms/admin_controller.rb +8 -0
  31. data/app/controllers/camaleon_cms/apps/plugins_admin_controller.rb +5 -0
  32. data/app/controllers/concerns/camaleon_cms/admin/custom_fields_concern.rb +29 -0
  33. data/app/decorators/camaleon_cms/post_decorator.rb +1 -1
  34. data/app/decorators/camaleon_cms/user_decorator.rb +1 -1
  35. data/app/helpers/camaleon_cms/admin/application_helper.rb +17 -17
  36. data/app/helpers/camaleon_cms/admin/post_type_helper.rb +25 -22
  37. data/app/helpers/camaleon_cms/comment_helper.rb +74 -40
  38. data/app/helpers/camaleon_cms/frontend/content_select_helper.rb +1 -1
  39. data/app/helpers/camaleon_cms/frontend/nav_menu_helper.rb +7 -7
  40. data/app/helpers/camaleon_cms/html_helper.rb +15 -1
  41. data/app/helpers/camaleon_cms/session_helper.rb +13 -1
  42. data/app/helpers/camaleon_cms/site_helper.rb +16 -3
  43. data/app/helpers/camaleon_cms/uploader_helper.rb +102 -51
  44. data/app/models/camaleon_cms/ability.rb +54 -102
  45. data/app/models/camaleon_cms/category.rb +2 -0
  46. data/app/models/camaleon_cms/custom_field.rb +14 -0
  47. data/app/models/camaleon_cms/custom_field_group.rb +38 -1
  48. data/app/models/camaleon_cms/custom_fields_relationship.rb +1 -1
  49. data/app/models/camaleon_cms/meta.rb +4 -0
  50. data/app/models/camaleon_cms/nav_menu.rb +2 -0
  51. data/app/models/camaleon_cms/nav_menu_item.rb +2 -0
  52. data/app/models/camaleon_cms/plugin.rb +2 -0
  53. data/app/models/camaleon_cms/post.rb +1 -1
  54. data/app/models/camaleon_cms/post_comment.rb +4 -0
  55. data/app/models/camaleon_cms/post_tag.rb +2 -0
  56. data/app/models/camaleon_cms/post_type.rb +3 -1
  57. data/app/models/camaleon_cms/site.rb +2 -0
  58. data/app/models/camaleon_cms/term_taxonomy.rb +1 -23
  59. data/app/models/camaleon_cms/theme.rb +2 -0
  60. data/app/models/camaleon_cms/user_role.rb +13 -0
  61. data/app/models/camaleon_cms/widget/main.rb +2 -0
  62. data/app/models/camaleon_cms/widget/sidebar.rb +2 -0
  63. data/app/models/camaleon_record.rb +40 -0
  64. data/app/models/concerns/camaleon_cms/custom_fields_read.rb +7 -7
  65. data/app/models/concerns/camaleon_cms/metas.rb +10 -6
  66. data/app/models/concerns/camaleon_cms/normalize_attrs.rb +26 -0
  67. data/app/models/concerns/camaleon_cms/user_methods.rb +6 -2
  68. data/app/models/current_request.rb +16 -0
  69. data/app/uploaders/camaleon_cms_aws_uploader.rb +8 -1
  70. data/app/validators/camaleon_cms/post_uniq_validator.rb +21 -8
  71. data/app/views/camaleon_cms/admin/appearances/nav_menus/_left_menu_items.html.erb +2 -2
  72. data/app/views/camaleon_cms/admin/appearances/widgets/main/form.html.erb +1 -1
  73. data/app/views/camaleon_cms/admin/categories/index.html.erb +1 -1
  74. data/app/views/camaleon_cms/admin/comments/index.html.erb +2 -2
  75. data/app/views/camaleon_cms/admin/comments/list.html.erb +1 -1
  76. data/app/views/camaleon_cms/admin/post_tags/index.html.erb +1 -1
  77. data/app/views/camaleon_cms/admin/posts/_sidebar.html.erb +1 -1
  78. data/app/views/camaleon_cms/admin/posts/index.html.erb +3 -3
  79. data/app/views/camaleon_cms/admin/search.html.erb +1 -1
  80. data/app/views/camaleon_cms/admin/settings/custom_fields/_render.html.erb +23 -2
  81. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_select_eval.html.erb +1 -1
  82. data/app/views/camaleon_cms/admin/settings/custom_fields/form.html.erb +6 -5
  83. data/app/views/camaleon_cms/admin/settings/custom_fields/index.html.erb +1 -1
  84. data/app/views/camaleon_cms/admin/settings/post_types/index.html.erb +1 -1
  85. data/app/views/camaleon_cms/admin/settings/sites/index.html.erb +1 -1
  86. data/app/views/camaleon_cms/admin/user_roles/form.html.erb +79 -5
  87. data/app/views/camaleon_cms/admin/user_roles/index.html.erb +1 -1
  88. data/app/views/camaleon_cms/admin/users/index.html.erb +1 -1
  89. data/app/views/layouts/camaleon_cms/admin/_flash_messages.html.erb +2 -2
  90. data/config/initializers/custom_initializers.rb +2 -2
  91. data/config/locales/camaleon_cms/admin/ar.yml +6 -2
  92. data/config/locales/camaleon_cms/admin/de.yml +6 -2
  93. data/config/locales/camaleon_cms/admin/en.yml +6 -2
  94. data/config/locales/camaleon_cms/admin/es.yml +6 -2
  95. data/config/locales/camaleon_cms/admin/fr.yml +6 -2
  96. data/config/locales/camaleon_cms/admin/it.yml +6 -2
  97. data/config/locales/camaleon_cms/admin/nl.yml +7 -2
  98. data/config/locales/camaleon_cms/admin/pt-BR.yml +6 -2
  99. data/config/locales/camaleon_cms/admin/pt.yml +6 -2
  100. data/config/locales/camaleon_cms/admin/ru.yml +6 -2
  101. data/config/locales/camaleon_cms/admin/uk.yml +6 -2
  102. data/config/locales/camaleon_cms/admin/zh-CH.yml +6 -2
  103. data/db/migrate/20150611161134_post_table_into_utf8.rb +14 -14
  104. data/db/migrate/20150926095310_rename_column_posts.rb +3 -3
  105. data/db/migrate/20151212095328_add_confirm_token_to_users.rb +3 -3
  106. data/db/migrate/20160504155652_add_feature_to_posts.rb +1 -1
  107. data/db/migrate/20160504155653_move_first_name_of_users.rb +2 -2
  108. data/db/migrate/20160609121449_add_group_to_custom_field_values.rb +1 -1
  109. data/db/migrate/20161215202255_drop_user_relationship_table.rb +1 -1
  110. data/db/migrate/20180124132318_create_media.rb +1 -1
  111. data/db/migrate/20180704211100_adjust_field_length.rb +1 -1
  112. data/lib/camaleon_cms/version.rb +1 -1
  113. data/lib/ext/string.rb +3 -3
  114. data/lib/plugin_routes.rb +6 -6
  115. data/lib/tasks/custom_fields_roles.rake +56 -0
  116. metadata +65 -8
@@ -574,7 +574,10 @@ uk:
574
574
  requires_different_email: 'Потрібні інші ел. пошта '
575
575
  created_pending_validate_email: "Користувач був створений, будь ласка, підтвердіть вашу електронну пошту"
576
576
  new_photo: 'Нова фотографія'
577
- others_permissions: 'Інші роздільності'
577
+ other_permissions: 'Інші роздільності'
578
+ select_eval_modal:
579
+ title: 'Небезпечний дозвіл'
580
+ description: 'Дозвіл select_eval дозволяє виконувати динамічний код з параметрів користувацьких полів. Увімкнення може призвести до довільного виконання коду, витоку даних і повної компрометації сайту, якщо обробляється недовірений вміст.'
578
581
  profile: 'Профіль'
579
582
  slogan: 'Слоган'
580
583
  type_contents: 'Тип Контенту'
@@ -600,7 +603,7 @@ uk:
600
603
  media: 'Permission to the midsection'
601
604
  publish: 'Вам потрібен дозвіл на Створення, редагування, Редагування інших або Опублікувати щоб включити цей дозвіл'
602
605
  themes: 'Дозвіл тим на розділ'
603
- widgets: 'Дозвіл віджетів на розділ'
606
+ widgets: 'Уможливлено редагування віджетів, зокрема збереження непродезінфікованого коду.'
604
607
  menus: 'Дозвіл на розділ Меню'
605
608
  plugins: 'Дозвіл на розділ Плагінів'
606
609
  users: 'Дозвіл на створення, редагування і видалення користувачів'
@@ -651,6 +654,7 @@ uk:
651
654
  error_created: "Бічна панель не створена."
652
655
  error_updated: "Бічна панель не оновлена."
653
656
  error_deleted: "Бічна панель видалена."
657
+ warning: "Попередження: Віджети можуть зберігати непродезінфіковані HTML та Javascript. Вводьте лише той код, який ви розумієте та якому довіряєте."
654
658
  intro:
655
659
  profile: "Тут ви можете побачити налаштування вашого профілю."
656
660
  content: "Цей блок містить всі групи контенту вашого сайту. Кожен контент може мати різну структуру, яких можна налаштувати в Налаштування => Група контентів"
@@ -607,7 +607,10 @@ zh-CN:
607
607
  role_can_not_be_deleted: '无法删除此角色'
608
608
  user_can_not_delete_own_account: '用户不能删除自己的帐户'
609
609
  new_photo: '新建照片'
610
- others_permissions: '其他权限'
610
+ other_permissions: '其他权限'
611
+ select_eval_modal:
612
+ title: '危险权限'
613
+ description: 'select_eval 权限允许从自定义字段选项中执行动态代码。启用后,如果评估不受信任的内容,可能导致任意代码执行、数据泄露以及站点被完全攻陷。'
611
614
  profile: '资料'
612
615
  slogan: '标语'
613
616
  type_contents: '内容的类型'
@@ -633,7 +636,7 @@ zh-CN:
633
636
  media: '媒体资源部分'
634
637
  publish: '开启该权限,允许创建,编辑, 或公开'
635
638
  themes: '主题部分'
636
- widgets: '插件部分'
639
+ widgets: '允许编辑小部件,包括保存未经清理的代码。'
637
640
  menus: '菜单部分'
638
641
  plugins: '插件部分'
639
642
  users: '创建,编辑,删除用户'
@@ -684,6 +687,7 @@ zh-CN:
684
687
  error_created: '侧边栏创建失败'
685
688
  error_updated: '侧边栏更新失败'
686
689
  error_deleted: "侧边栏已删除."
690
+ warning: "警告:小组件可以存储未经清理的 HTML 和 Javascript。仅输入您理解和信任的代码。"
687
691
  intro:
688
692
  profile: "在这个地方,您可以看到您的个人资料选项."
689
693
  content: "此块包含您网站的所有内容组。 每个内容可以具有在 设置 => 内容组"
@@ -1,12 +1,12 @@
1
1
  class PostTableIntoUtf8 < CamaManager.migration_class
2
2
  def change
3
3
  if table_exists? CamaleonCms::User.table_name
4
- add_column(CamaleonCms::User.table_name, :email, :string) unless column_exists?(CamaleonCms::User.table_name, :email)
5
- add_column(CamaleonCms::User.table_name, :username, :string) unless column_exists?(CamaleonCms::User.table_name, :username)
6
- add_column(CamaleonCms::User.table_name, :role, :string, default: 'client', index: true) unless column_exists?(CamaleonCms::User.table_name, :role)
7
- add_column(CamaleonCms::User.table_name, :parent_id, :integer) unless column_exists?(CamaleonCms::User.table_name, :parent_id)
8
- add_column(CamaleonCms::User.table_name, :site_id, :integer, index: true, default: -1) unless column_exists?(CamaleonCms::User.table_name, :site_id)
9
- add_column(CamaleonCms::User.table_name, :auth_token, :string) unless column_exists?(CamaleonCms::User.table_name, :auth_token)
4
+ add_column(CamaleonCms::User.table_name, :email, :string, if_not_exists: true)
5
+ add_column(CamaleonCms::User.table_name, :username, :string, if_not_exists: true)
6
+ add_column(CamaleonCms::User.table_name, :role, :string, default: 'client', index: true, if_not_exists: true)
7
+ add_column(CamaleonCms::User.table_name, :parent_id, :integer, if_not_exists: true)
8
+ add_column(CamaleonCms::User.table_name, :site_id, :integer, index: true, default: -1, if_not_exists: true)
9
+ add_column(CamaleonCms::User.table_name, :auth_token, :string, if_not_exists: true)
10
10
  else
11
11
  create_table CamaleonCms::User.table_name do |t|
12
12
  t.string "username", index: true
@@ -26,7 +26,7 @@ class PostTableIntoUtf8 < CamaManager.migration_class
26
26
  end
27
27
  end
28
28
 
29
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}term_taxonomy" do |t|
29
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}term_taxonomy", if_not_exists: true do |t|
30
30
  t.string "taxonomy", index: true
31
31
  t.text "description", limit: 1073741823
32
32
  t.integer "parent_id", index: true
@@ -41,7 +41,7 @@ class PostTableIntoUtf8 < CamaManager.migration_class
41
41
  t.belongs_to :user, index: true#, foreign_key: true
42
42
  end
43
43
 
44
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}posts" do |t|
44
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}posts", if_not_exists: true do |t|
45
45
  t.string "title"
46
46
  t.string "slug", index: true
47
47
  t.text "content", limit: 1073741823
@@ -58,13 +58,13 @@ class PostTableIntoUtf8 < CamaManager.migration_class
58
58
  t.belongs_to :user, index: true#, foreign_key: true
59
59
  end
60
60
 
61
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}term_relationships" do |t|
61
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}term_relationships", if_not_exists: true do |t|
62
62
  t.integer "objectid", index: true
63
63
  t.integer "term_order", index: true
64
64
  t.belongs_to :term_taxonomy, index: true
65
65
  end
66
66
 
67
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}user_relationships" do |t|
67
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}user_relationships", if_not_exists: true do |t|
68
68
  t.integer "term_order"
69
69
  t.integer "active", default: 1
70
70
 
@@ -72,7 +72,7 @@ class PostTableIntoUtf8 < CamaManager.migration_class
72
72
  t.belongs_to :user, index: true
73
73
  end
74
74
 
75
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}comments" do |t|
75
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}comments", if_not_exists: true do |t|
76
76
  t.string "author"
77
77
  t.string "author_email"
78
78
  t.string "author_url"
@@ -87,7 +87,7 @@ class PostTableIntoUtf8 < CamaManager.migration_class
87
87
  t.timestamps null: false
88
88
  end
89
89
 
90
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}custom_fields" do |t|
90
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}custom_fields", if_not_exists: true do |t|
91
91
  t.string "object_class", index: true
92
92
  t.string "name"
93
93
  t.string "slug", index: true
@@ -100,7 +100,7 @@ class PostTableIntoUtf8 < CamaManager.migration_class
100
100
  t.string "status"
101
101
  end
102
102
 
103
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}custom_fields_relationships" do |t|
103
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}custom_fields_relationships", if_not_exists: true do |t|
104
104
  t.integer "objectid", index: true
105
105
  t.integer "custom_field_id", index: true
106
106
  t.integer "term_order"
@@ -109,7 +109,7 @@ class PostTableIntoUtf8 < CamaManager.migration_class
109
109
  t.string "custom_field_slug", index: true
110
110
  end
111
111
 
112
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}metas" do |t|
112
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}metas", if_not_exists: true do |t|
113
113
  t.string "key", index: true
114
114
  t.text "value", limit: 1073741823
115
115
  t.integer "objectid", index: true
@@ -1,9 +1,9 @@
1
1
  # change post structure to optimize query speed
2
2
  class RenameColumnPosts < CamaManager.migration_class
3
3
  def change
4
- remove_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :comment_count
5
- add_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :post_order, :integer, default: 0
6
- add_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :taxonomy_id, :integer, default: nil, index: true
4
+ remove_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :comment_count, if_exists: true
5
+ add_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :post_order, :integer, default: 0, if_not_exists: true
6
+ add_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :taxonomy_id, :integer, default: nil, index: true, if_not_exists: true
7
7
  CamaleonCms::Post.all.each do |post|
8
8
  begin
9
9
  post_id = post.get_post_type_depre.id
@@ -1,7 +1,7 @@
1
1
  class AddConfirmTokenToUsers < CamaManager.migration_class
2
2
  def change
3
- add_column CamaleonCms::User.table_name, :confirm_email_token, :string, default: nil
4
- add_column CamaleonCms::User.table_name, :confirm_email_sent_at, :datetime, default: nil
5
- add_column CamaleonCms::User.table_name, :is_valid_email, :boolean, default: true
3
+ add_column CamaleonCms::User.table_name, :confirm_email_token, :string, default: nil, if_not_exists: true
4
+ add_column CamaleonCms::User.table_name, :confirm_email_sent_at, :datetime, default: nil, if_not_exists: true
5
+ add_column CamaleonCms::User.table_name, :is_valid_email, :boolean, default: true, if_not_exists: true
6
6
  end
7
7
  end
@@ -1,5 +1,5 @@
1
1
  class AddFeatureToPosts < CamaManager.migration_class
2
2
  def change
3
- add_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :is_feature, :boolean, default: false
3
+ add_column "#{PluginRoutes.static_system_info["db_prefix"]}posts", :is_feature, :boolean, default: false, if_not_exists: true
4
4
  end
5
5
  end
@@ -1,7 +1,7 @@
1
1
  class MoveFirstNameOfUsers < CamaManager.migration_class
2
2
  def change
3
- add_column CamaleonCms::User.table_name, :first_name, :string unless column_exists?(CamaleonCms::User.table_name, :first_name)
4
- add_column CamaleonCms::User.table_name, :last_name, :string unless column_exists?(CamaleonCms::User.table_name, :last_name)
3
+ add_column CamaleonCms::User.table_name, :first_name, :string, if_not_exists: true
4
+ add_column CamaleonCms::User.table_name, :last_name, :string, if_not_exists: true
5
5
  CamaleonCms::User.all.each do |u|
6
6
  u.update_columns(first_name: u.get_meta('first_name'), last_name: u.get_meta('last_name')) if u.get_meta('first_name').present?
7
7
  end
@@ -1,5 +1,5 @@
1
1
  class AddGroupToCustomFieldValues < CamaManager.migration_class
2
2
  def change
3
- add_column "#{PluginRoutes.static_system_info["db_prefix"]}custom_fields_relationships", :group_number, :integer, default: 0
3
+ add_column "#{PluginRoutes.static_system_info["db_prefix"]}custom_fields_relationships", :group_number, :integer, default: 0, if_not_exists: true
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class DropUserRelationshipTable < CamaManager.migration_class
2
2
  def change
3
- drop_table "#{PluginRoutes.static_system_info["db_prefix"]}user_relationships"
3
+ drop_table "#{PluginRoutes.static_system_info["db_prefix"]}user_relationships", if_exists: true
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  class CreateMedia < CamaManager.migration_class
2
2
  def change
3
- create_table "#{PluginRoutes.static_system_info["db_prefix"]}media" do |t|
3
+ create_table "#{PluginRoutes.static_system_info["db_prefix"]}media", if_not_exists: true do |t|
4
4
  t.references :site, index: true
5
5
  t.string :name, index: true
6
6
  t.boolean :is_folder, index: true, default: false
@@ -2,7 +2,7 @@ class AdjustFieldLength < CamaManager.migration_class
2
2
  def change
3
3
  post_table = CamaleonCms::Post.table_name
4
4
  change_column post_table, :title, :text
5
- remove_index(post_table, :slug) if index_exists?(post_table, :slug)
5
+ remove_index(post_table, :slug, if_exists: true)
6
6
  change_column post_table, :slug, :text
7
7
  add_index post_table, :slug, length: 255
8
8
  change_column "#{PluginRoutes.static_system_info["db_prefix"]}term_taxonomy", :name, :text
@@ -1,3 +1,3 @@
1
1
  module CamaleonCms
2
- VERSION = '2.9.0'.freeze
2
+ VERSION = '2.9.2'.freeze
3
3
  end
data/lib/ext/string.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  class String
2
2
  def to_bool
3
- return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
4
- return false if self == false || blank? || self =~ (/(false|f|no|n|0)$/i)
3
+ return true if self == true || self =~ /(true|t|yes|y|1)$/i
4
+ return false if self == false || blank? || self =~ /(false|f|no|n|0)$/i
5
5
 
6
6
  raise ArgumentError, "invalid value for Boolean: \"#{self}\""
7
7
  end
@@ -111,7 +111,7 @@ class String
111
111
  name = name.gsub(sanitize_regexp, '_')
112
112
  name = "_#{name}" if name =~ /\A\.+\z/
113
113
  name = 'unnamed' if name.empty?
114
- name.mb_chars.to_s
114
+ name
115
115
  end
116
116
 
117
117
  # return cleaned model class name
data/lib/plugin_routes.rb CHANGED
@@ -174,12 +174,12 @@ class PluginRoutes
174
174
  @@all_sites = nil
175
175
  @@_vars.each { |v| class_variable_set("@@cache_#{v}", nil) }
176
176
  Rails.application.reload_routes!
177
- @@_after_reload.uniq.each { |r| eval(r) }
177
+ @@_after_reload.uniq.each(&:call)
178
178
  end
179
179
 
180
- # permit to add extra actions for reload routes
180
+ # Add a callable (Proc/Lambda) to run after routes reload; strings are not supported.
181
181
  def self.add_after_reload_routes(command)
182
- @@_after_reload << command
182
+ @@_after_reload << (command.is_a?(String) ? raise(ArgumentError, 'Expected a callable (Proc/Lambda), not a String') : command)
183
183
  end
184
184
 
185
185
  # return all enabled plugins []
@@ -275,7 +275,7 @@ class PluginRoutes
275
275
 
276
276
  def self.cache_variable(var_name, value = nil)
277
277
  @@_vars.push(var_name).uniq!
278
- # if Rails.env != "development" # disable cache plugin routes for develoment mode
278
+ # if Rails.env != "development" # disable cache plugin routes for development mode
279
279
  cache = begin
280
280
  class_variable_get("@@cache_#{var_name}")
281
281
  rescue StandardError
@@ -376,9 +376,9 @@ class PluginRoutes
376
376
  return r unless r.nil? || r == []
377
377
 
378
378
  res = get_gem_themes
379
- entries = ['.', '..']
379
+ entries = %w[. ..]
380
380
  res.each { |theme| entries << theme['key'] }
381
- (Dir["#{apps_dir}/themes/*"]).each do |path|
381
+ Dir["#{apps_dir}/themes/*"].each do |path|
382
382
  entry = path.split('/').last
383
383
  config = File.join(path, 'config', 'config.json')
384
384
  next if entries.include?(entry) || !File.directory?(path) || !File.exist?(config)
@@ -0,0 +1,56 @@
1
+ namespace :camaleon_cms do
2
+ desc 'Backfill user roles to include custom_fields manager permission'
3
+ task backfill_custom_fields_permission: :environment do
4
+ Rails.logger.info 'Backfilling custom_fields manager permission for existing user roles...'
5
+ CamaleonCms::UserRole.find_each do |role|
6
+ key = "_manager_#{role.parent_id}"
7
+ begin
8
+ current_role = role.get_meta(key)
9
+ # if the role already has settings/managers, skip; otherwise add custom_fields => 1
10
+ if current_role.blank? || (!current_role.is_a?(Hash) || current_role['custom_fields'].blank?)
11
+ current_role = (current_role.is_a?(Hash) ? current_role : {}).merge!('custom_fields' => 1)
12
+ role.set_meta(key, current_role)
13
+ Rails.logger.info "Updated role=#{role.slug} site_id=#{role.parent_id}"
14
+ else
15
+ Rails.logger.info "Skipped role=#{role.slug} site_id=#{role.parent_id} (already has custom_fields)"
16
+ end
17
+ rescue StandardError => e
18
+ Rails.logger.info "Failed to update role=#{role.slug}: #{e.message}"
19
+ end
20
+ end
21
+ Rails.logger.info 'Done.'
22
+ end
23
+
24
+ desc 'Backfill admin user roles to include select_eval permission'
25
+ task backfill_select_eval_permission: :environment do
26
+ Rails.logger.info 'Backfilling select_eval permission for admin roles...'
27
+ updated_count = 0
28
+ skipped_count = 0
29
+
30
+ CamaleonCms::UserRole.where(slug: 'admin', term_group: -1).find_each do |role|
31
+ site_id = role.parent_id
32
+ key = "_manager_#{site_id}"
33
+ begin
34
+ current_meta = role.get_meta(key, {})
35
+
36
+ # Only update if role doesn't already have select_eval
37
+ if !current_meta[:select_eval]
38
+ updated_meta = current_meta.merge(select_eval: 1)
39
+ role.set_meta(key, updated_meta)
40
+ Rails.logger.info "✓ Updated admin role site_id=#{site_id}"
41
+ updated_count += 1
42
+ else
43
+ Rails.logger.info " Skipped admin role site_id=#{site_id} (already has select_eval)"
44
+ skipped_count += 1
45
+ end
46
+ rescue StandardError => e
47
+ Rails.logger.info "✗ Failed to update admin role site_id=#{site_id}: #{e.message}"
48
+ end
49
+ end
50
+
51
+ Rails.logger.info "\nSummary:"
52
+ Rails.logger.info " Updated: #{updated_count} admin roles"
53
+ Rails.logger.info " Skipped: #{skipped_count} admin roles"
54
+ Rails.logger.info "\nDone! All admin roles now have select_eval permission."
55
+ end
56
+ end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: camaleon_cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.0
4
+ version: 2.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Owen Peredo Diaz
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-01-06 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: addressable
@@ -204,14 +203,14 @@ dependencies:
204
203
  requirements:
205
204
  - - "~>"
206
205
  - !ruby/object:Gem::Version
207
- version: '2.0'
206
+ version: '2.6'
208
207
  type: :runtime
209
208
  prerelease: false
210
209
  version_requirements: !ruby/object:Gem::Requirement
211
210
  requirements:
212
211
  - - "~>"
213
212
  - !ruby/object:Gem::Version
214
- version: '2.0'
213
+ version: '2.6'
215
214
  - !ruby/object:Gem::Dependency
216
215
  name: sprockets-rails
217
216
  requirement: !ruby/object:Gem::Requirement
@@ -268,6 +267,34 @@ dependencies:
268
267
  - - ">="
269
268
  - !ruby/object:Gem::Version
270
269
  version: '0'
270
+ - !ruby/object:Gem::Dependency
271
+ name: net-http
272
+ requirement: !ruby/object:Gem::Requirement
273
+ requirements:
274
+ - - ">="
275
+ - !ruby/object:Gem::Version
276
+ version: '0'
277
+ type: :runtime
278
+ prerelease: false
279
+ version_requirements: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - ">="
282
+ - !ruby/object:Gem::Version
283
+ version: '0'
284
+ - !ruby/object:Gem::Dependency
285
+ name: tempfile
286
+ requirement: !ruby/object:Gem::Requirement
287
+ requirements:
288
+ - - ">="
289
+ - !ruby/object:Gem::Version
290
+ version: '0'
291
+ type: :runtime
292
+ prerelease: false
293
+ version_requirements: !ruby/object:Gem::Requirement
294
+ requirements:
295
+ - - ">="
296
+ - !ruby/object:Gem::Version
297
+ version: '0'
271
298
  - !ruby/object:Gem::Dependency
272
299
  name: aws-sdk-s3
273
300
  requirement: !ruby/object:Gem::Requirement
@@ -282,6 +309,34 @@ dependencies:
282
309
  - - "~>"
283
310
  - !ruby/object:Gem::Version
284
311
  version: '1'
312
+ - !ruby/object:Gem::Dependency
313
+ name: brakeman
314
+ requirement: !ruby/object:Gem::Requirement
315
+ requirements:
316
+ - - ">="
317
+ - !ruby/object:Gem::Version
318
+ version: '0'
319
+ type: :development
320
+ prerelease: false
321
+ version_requirements: !ruby/object:Gem::Requirement
322
+ requirements:
323
+ - - ">="
324
+ - !ruby/object:Gem::Version
325
+ version: '0'
326
+ - !ruby/object:Gem::Dependency
327
+ name: bundler-audit
328
+ requirement: !ruby/object:Gem::Requirement
329
+ requirements:
330
+ - - ">="
331
+ - !ruby/object:Gem::Version
332
+ version: '0'
333
+ type: :development
334
+ prerelease: false
335
+ version_requirements: !ruby/object:Gem::Requirement
336
+ requirements:
337
+ - - ">="
338
+ - !ruby/object:Gem::Version
339
+ version: '0'
285
340
  - !ruby/object:Gem::Dependency
286
341
  name: byebug
287
342
  requirement: !ruby/object:Gem::Requirement
@@ -730,6 +785,7 @@ files:
730
785
  - app/controllers/camaleon_cms/apps/themes_front_controller.rb
731
786
  - app/controllers/camaleon_cms/camaleon_controller.rb
732
787
  - app/controllers/camaleon_cms/frontend_controller.rb
788
+ - app/controllers/concerns/camaleon_cms/admin/custom_fields_concern.rb
733
789
  - app/controllers/concerns/camaleon_cms/frontend_concern.rb
734
790
  - app/decorators/camaleon_cms/application_decorator.rb
735
791
  - app/decorators/camaleon_cms/category_decorator.rb
@@ -805,8 +861,10 @@ files:
805
861
  - app/models/concerns/camaleon_cms/common_relationships.rb
806
862
  - app/models/concerns/camaleon_cms/custom_fields_read.rb
807
863
  - app/models/concerns/camaleon_cms/metas.rb
864
+ - app/models/concerns/camaleon_cms/normalize_attrs.rb
808
865
  - app/models/concerns/camaleon_cms/site_default_settings.rb
809
866
  - app/models/concerns/camaleon_cms/user_methods.rb
867
+ - app/models/current_request.rb
810
868
  - app/models/plugins.rb
811
869
  - app/models/themes.rb
812
870
  - app/uploaders/camaleon_cms_aws_uploader.rb
@@ -1130,11 +1188,11 @@ files:
1130
1188
  - lib/plugin_routes.rb
1131
1189
  - lib/tasks/camaleon_cms/camaleon_tasks.rake
1132
1190
  - lib/tasks/camaleon_cms/rspec_test.rake
1191
+ - lib/tasks/custom_fields_roles.rake
1133
1192
  homepage: https://camaleon.website
1134
1193
  licenses:
1135
1194
  - MIT
1136
1195
  metadata: {}
1137
- post_install_message:
1138
1196
  rdoc_options: []
1139
1197
  require_paths:
1140
1198
  - lib
@@ -1152,8 +1210,7 @@ requirements:
1152
1210
  - rails >= 6.1
1153
1211
  - ruby >= 3.0
1154
1212
  - imagemagick
1155
- rubygems_version: 3.5.17
1156
- signing_key:
1213
+ rubygems_version: 3.6.9
1157
1214
  specification_version: 4
1158
1215
  summary: Camaleon is a CMS for Ruby on Rails as an alternative to Wordpress.
1159
1216
  test_files: []