alchemy_cms 6.0.0.pre.b5 → 6.0.0.pre.rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/brakeman-analysis.yml +46 -0
- data/.github/workflows/ci.yml +4 -3
- data/CHANGELOG.md +31 -0
- data/Gemfile +6 -1
- data/README.md +1 -1
- data/SECURITY.md +13 -0
- data/alchemy_cms.gemspec +2 -2
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +7 -6
- data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +3 -3
- data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +7 -7
- data/app/controllers/alchemy/admin/elements_controller.rb +8 -4
- data/app/models/alchemy/attachment.rb +1 -1
- data/app/models/alchemy/element/presenters.rb +9 -2
- data/app/models/alchemy/element.rb +1 -1
- data/app/models/alchemy/node.rb +1 -1
- data/app/models/alchemy/page.rb +1 -1
- data/app/models/alchemy/picture.rb +1 -1
- data/app/views/alchemy/ingredients/_picture_editor.html.erb +2 -2
- data/config/brakeman.ignore +25 -5
- data/lib/alchemy/engine.rb +1 -1
- data/lib/alchemy/taggable.rb +11 -4
- data/lib/alchemy/upgrader.rb +6 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/generators/alchemy/install/install_generator.rb +2 -1
- data/lib/tasks/alchemy/upgrade.rake +6 -0
- data/package.json +1 -1
- metadata +37 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21260eb0f68590cfe400b34ba5cbfe8d18551ed9fd2f6cc206bb5c7ed2aebb66
|
4
|
+
data.tar.gz: 870421eb1bbaf3c7b246de59379297f63f3719da3601e1ac07f8bb72877d6c0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8056e9a0e2cebea3069b47405f60339e4dbb1af55399323a32f7298976e918318ec7e790674a273d84825c0416c6658127dba68c5596562e0f8687bb9cbcd56e
|
7
|
+
data.tar.gz: 438ee71b5721ccf34a713a9c6469c5cc1a383a1dd75f7534348cb25b9ef9f9dd668e59821e7d3c087c1f3cc3d86fbf121d5e7b0c07905dfcb2f4cd431005f13d
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# This workflow integrates Brakeman with GitHub's Code Scanning feature
|
2
|
+
# Brakeman is a static analysis security vulnerability scanner for Ruby on Rails applications
|
3
|
+
|
4
|
+
name: Brakeman Scan
|
5
|
+
|
6
|
+
on:
|
7
|
+
push:
|
8
|
+
branches: [ main ]
|
9
|
+
pull_request:
|
10
|
+
# The branches below must be a subset of the branches above
|
11
|
+
branches: [ main ]
|
12
|
+
schedule:
|
13
|
+
- cron: '40 4 * * 2'
|
14
|
+
|
15
|
+
jobs:
|
16
|
+
brakeman-scan:
|
17
|
+
name: Brakeman Scan
|
18
|
+
runs-on: ubuntu-latest
|
19
|
+
steps:
|
20
|
+
# Checkout the repository to the GitHub Actions runner
|
21
|
+
- name: Checkout
|
22
|
+
uses: actions/checkout@v2
|
23
|
+
|
24
|
+
# Customize the ruby version depending on your needs
|
25
|
+
- name: Setup Ruby
|
26
|
+
uses: actions/setup-ruby@v1
|
27
|
+
with:
|
28
|
+
ruby-version: '2.7'
|
29
|
+
|
30
|
+
- name: Setup Brakeman
|
31
|
+
env:
|
32
|
+
BRAKEMAN_VERSION: '4.10' # SARIF support is provided in Brakeman version 4.10+
|
33
|
+
run: |
|
34
|
+
gem install brakeman --version $BRAKEMAN_VERSION
|
35
|
+
|
36
|
+
# Execute Brakeman CLI and generate a SARIF output with the security issues identified during the analysis
|
37
|
+
- name: Scan
|
38
|
+
continue-on-error: true
|
39
|
+
run: |
|
40
|
+
brakeman -f sarif -o output.sarif.json .
|
41
|
+
|
42
|
+
# Upload the SARIF file generated in the previous step
|
43
|
+
- name: Upload SARIF
|
44
|
+
uses: github/codeql-action/upload-sarif@v1
|
45
|
+
with:
|
46
|
+
sarif_file: output.sarif.json
|
data/.github/workflows/ci.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,34 @@
|
|
1
|
+
## 6.0.0-rc3 (2021-11-24)
|
2
|
+
|
3
|
+
### Changes
|
4
|
+
|
5
|
+
- Set stampable user_class_name without root identifier [#2215](https://github.com/AlchemyCMS/alchemy_cms/pull/2215) ([tvdeyen](https://github.com/tvdeyen))
|
6
|
+
- Allow all possible args in tagged_with method [#2211](https://github.com/AlchemyCMS/alchemy_cms/pull/2211) ([robinboening](https://github.com/robinboening))
|
7
|
+
|
8
|
+
### Fixes
|
9
|
+
|
10
|
+
- fix(ImageCropper): Add dom ids to picture crop fields [#2219](https://github.com/AlchemyCMS/alchemy_cms/pull/2219) ([tvdeyen](https://github.com/tvdeyen))
|
11
|
+
- Adjust tinymce skin assets urls again [#2218](https://github.com/AlchemyCMS/alchemy_cms/pull/2218) ([tvdeyen](https://github.com/tvdeyen))
|
12
|
+
- Use relative path for tinymce font-face [#2214](https://github.com/AlchemyCMS/alchemy_cms/pull/2214) ([tvdeyen](https://github.com/tvdeyen))
|
13
|
+
|
14
|
+
### Misc
|
15
|
+
|
16
|
+
- Install correct npm package [#2204](https://github.com/AlchemyCMS/alchemy_cms/pull/2204) ([tvdeyen](https://github.com/tvdeyen))
|
17
|
+
- Switch to cuprite for system testing [#2203](https://github.com/AlchemyCMS/alchemy_cms/pull/2203) ([tvdeyen](https://github.com/tvdeyen))
|
18
|
+
- Upgrade webdrivers to version 5.0.0 [#2201](https://github.com/AlchemyCMS/alchemy_cms/pull/2201) ([depfu](https://github.com/apps/depfu))
|
19
|
+
|
20
|
+
## 6.0.0-rc2 (2021-10-13)
|
21
|
+
|
22
|
+
- Fix init link dialog if used in tinymce [#2200](https://github.com/AlchemyCMS/alchemy_cms/pull/2200) ([tvdeyen](https://github.com/tvdeyen))
|
23
|
+
|
24
|
+
## 6.0.0-rc1 (2021-09-12)
|
25
|
+
|
26
|
+
- Allow Rails 6.1 [#2047](https://github.com/AlchemyCMS/alchemy_cms/pull/2047) ([robinboening](https://github.com/robinboening))
|
27
|
+
|
28
|
+
## 6.0.0-b6 (2021-09-02)
|
29
|
+
|
30
|
+
- Fix element with ingredients preview text [#2187](https://github.com/AlchemyCMS/alchemy_cms/pull/2187) ([tvdeyen](https://github.com/tvdeyen))
|
31
|
+
- Do not validate element during toggle fold and create [#2186](https://github.com/AlchemyCMS/alchemy_cms/pull/2186) ([tvdeyen](https://github.com/tvdeyen))
|
1
32
|
## 6.0.0-b5 (2021-08-27)
|
2
33
|
|
3
34
|
- Remove spec that tests default data store value [#2184](https://github.com/AlchemyCMS/alchemy_cms/pull/2184) ([tvdeyen](https://github.com/tvdeyen))
|
data/Gemfile
CHANGED
@@ -3,7 +3,7 @@ source "https://rubygems.org"
|
|
3
3
|
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
rails_version = ENV.fetch("RAILS_VERSION", 6.
|
6
|
+
rails_version = ENV.fetch("RAILS_VERSION", 6.1).to_f
|
7
7
|
gem "rails", "~> #{rails_version}.0"
|
8
8
|
|
9
9
|
if ENV["DB"].nil? || ENV["DB"] == "sqlite"
|
@@ -40,3 +40,8 @@ group :development, :test do
|
|
40
40
|
gem "brakeman", require: false
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
# Necessary for system tests in Rails 6.0
|
45
|
+
if ENV["RAILS_VERSION"] == "6.0"
|
46
|
+
gem "selenium-webdriver"
|
47
|
+
end
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ Alchemy is an open source CMS engine written in Ruby on Rails.
|
|
18
18
|
|
19
19
|
Read more about Alchemy on the [website](https://alchemy-cms.com) and in the [guidelines](https://guides.alchemy-cms.com).
|
20
20
|
|
21
|
-
**CAUTION: This main branch is a development branch that *can* contain bugs. For productive environments you should use the [current Ruby gem version](https://rubygems.org/gems/alchemy_cms), or the [latest stable branch (5.
|
21
|
+
**CAUTION: This main branch is a development branch that *can* contain bugs. For productive environments you should use the [current Ruby gem version](https://rubygems.org/gems/alchemy_cms), or the [latest stable branch (5.2-stable)](https://github.com/AlchemyCMS/alchemy_cms/tree/5.2-stable).**
|
22
22
|
|
23
23
|
|
24
24
|
## ✅ Features
|
data/SECURITY.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Security Policy
|
2
|
+
|
3
|
+
## Supported Versions
|
4
|
+
|
5
|
+
We support the current major and last minor version of the previous major version with security fixes.
|
6
|
+
|
7
|
+
## Reporting a Vulnerability
|
8
|
+
|
9
|
+
Please send a preferably encrypted email to hello@alchemy-cms.com
|
10
|
+
|
11
|
+
PGP public key finger print
|
12
|
+
|
13
|
+
52D3 2070 4BF3 E5C5 035C BC71 17E9 E620 A96B 4CE0
|
data/alchemy_cms.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |gem|
|
|
29
29
|
activesupport
|
30
30
|
railties
|
31
31
|
].each do |rails_gem|
|
32
|
-
gem.add_runtime_dependency rails_gem, [">= 6.0", "< 6.
|
32
|
+
gem.add_runtime_dependency rails_gem, [">= 6.0", "< 6.2"]
|
33
33
|
end
|
34
34
|
|
35
35
|
gem.add_runtime_dependency "active_model_serializers", ["~> 0.10.0"]
|
@@ -57,13 +57,13 @@ Gem::Specification.new do |gem|
|
|
57
57
|
|
58
58
|
gem.add_development_dependency "capybara", ["~> 3.0"]
|
59
59
|
gem.add_development_dependency "capybara-screenshot", ["~> 1.0"]
|
60
|
+
gem.add_development_dependency "cuprite", ["~> 0.13"]
|
60
61
|
gem.add_development_dependency "factory_bot_rails", ["~> 6.0"]
|
61
62
|
gem.add_development_dependency "puma", ["~> 5.0"]
|
62
63
|
gem.add_development_dependency "rails-controller-testing", ["~> 1.0"]
|
63
64
|
gem.add_development_dependency "rspec-activemodel-mocks", ["~> 1.0"]
|
64
65
|
gem.add_development_dependency "rspec-rails", [">= 4.0.0.beta2"]
|
65
66
|
gem.add_development_dependency "simplecov", ["~> 0.20"]
|
66
|
-
gem.add_development_dependency "webdrivers", ["~> 4.0"]
|
67
67
|
gem.add_development_dependency "webmock", ["~> 3.3"]
|
68
68
|
gem.add_development_dependency "shoulda-matchers", ["~> 5.0"]
|
69
69
|
gem.add_development_dependency "timecop", ["~> 0.9"]
|
@@ -4,12 +4,13 @@
|
|
4
4
|
class window.Alchemy.LinkDialog extends Alchemy.Dialog
|
5
5
|
|
6
6
|
constructor: (@link_object) ->
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
if @link_object.dataset
|
8
|
+
parent_selector = @link_object.dataset.parentSelector
|
9
|
+
parent = document.querySelector(parent_selector)
|
10
|
+
@link_value_field = parent.querySelector("[data-link-value]")
|
11
|
+
@link_title_field = parent.querySelector("[data-link-title]")
|
12
|
+
@link_target_field = parent.querySelector("[data-link-target]")
|
13
|
+
@link_class_field = parent.querySelector("[data-link-class]")
|
13
14
|
@url = Alchemy.routes.link_admin_pages_path
|
14
15
|
@$link_object = $(@link_object)
|
15
16
|
@options =
|
@@ -30,7 +30,7 @@ td,th {
|
|
30
30
|
|
31
31
|
.mce-object {
|
32
32
|
border: 1px dotted #3a3a3a;
|
33
|
-
background: #d5d5d5 url(img/object.gif) no-repeat center;
|
33
|
+
background: #d5d5d5 url('tinymce/skins/alchemy/fonts/img/object.gif') no-repeat center;
|
34
34
|
}
|
35
35
|
|
36
36
|
.mce-pagebreak {
|
@@ -55,7 +55,7 @@ td,th {
|
|
55
55
|
width: 9px!important;
|
56
56
|
height: 9px!important;
|
57
57
|
border: 1px dotted #3a3a3a;
|
58
|
-
background: #d5d5d5 url(img/anchor.gif) no-repeat center;
|
58
|
+
background: #d5d5d5 url('tinymce/skins/alchemy/fonts/img/anchor.gif') no-repeat center;
|
59
59
|
}
|
60
60
|
|
61
61
|
.mce-nbsp {
|
@@ -77,7 +77,7 @@ hr {
|
|
77
77
|
}
|
78
78
|
|
79
79
|
.mce-spellchecker-word {
|
80
|
-
background: url(img/wline.gif) repeat-x bottom left;
|
80
|
+
background: url('tinymce/skins/alchemy/fonts/img/wline.gif') repeat-x bottom left;
|
81
81
|
cursor: default;
|
82
82
|
}
|
83
83
|
|
@@ -1561,23 +1561,23 @@ i.mce-i-resize {
|
|
1561
1561
|
opacity: 0.6;
|
1562
1562
|
filter: alpha(opacity=60);
|
1563
1563
|
zoom: 1;
|
1564
|
-
background: #fff url('img/loader.gif') no-repeat center center;
|
1564
|
+
background: #fff url('tinymce/skins/alchemy/fonts/img/loader.gif') no-repeat center center;
|
1565
1565
|
}
|
1566
1566
|
|
1567
1567
|
@font-face {
|
1568
1568
|
font-family: 'tinymce';
|
1569
|
-
src: url('fonts/tinymce.woff') format('woff'),
|
1570
|
-
url('fonts/tinymce.ttf') format('truetype'),
|
1571
|
-
url('fonts/tinymce.svg#tinymce') format('svg');
|
1569
|
+
src: url('tinymce/skins/alchemy/fonts/tinymce.woff') format('woff'),
|
1570
|
+
url('tinymce/skins/alchemy/fonts/tinymce.ttf') format('truetype'),
|
1571
|
+
url('tinymce/skins/alchemy/fonts/tinymce.svg#tinymce') format('svg');
|
1572
1572
|
font-weight: normal;
|
1573
1573
|
font-style: normal;
|
1574
1574
|
}
|
1575
1575
|
|
1576
1576
|
@font-face {
|
1577
1577
|
font-family: 'tinymce-small';
|
1578
|
-
src: url('fonts/tinymce-small.woff') format('woff'),
|
1579
|
-
url('fonts/tinymce-small.ttf') format('truetype'),
|
1580
|
-
url('fonts/tinymce-small.svg#tinymce') format('svg');
|
1578
|
+
src: url('tinymce/skins/alchemy/fonts/tinymce-small.woff') format('woff'),
|
1579
|
+
url('tinymce/skins/alchemy/fonts/tinymce-small.ttf') format('truetype'),
|
1580
|
+
url('tinymce/skins/alchemy/fonts/tinymce-small.svg#tinymce') format('svg');
|
1581
1581
|
font-weight: normal;
|
1582
1582
|
font-style: normal;
|
1583
1583
|
}
|
@@ -32,14 +32,14 @@ module Alchemy
|
|
32
32
|
if @paste_from_clipboard = params[:paste_from_clipboard].present?
|
33
33
|
@element = paste_element_from_clipboard
|
34
34
|
else
|
35
|
-
@element = Element.
|
35
|
+
@element = Element.new(create_element_params)
|
36
36
|
end
|
37
37
|
if @page.definition["insert_elements_at"] == "top"
|
38
38
|
@insert_at_top = true
|
39
|
-
@element.
|
39
|
+
@element.position = 1
|
40
40
|
end
|
41
41
|
end
|
42
|
-
if @element.
|
42
|
+
if @element.save
|
43
43
|
render :create
|
44
44
|
else
|
45
45
|
@element.page_version = @page_version
|
@@ -91,10 +91,14 @@ module Alchemy
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
# Toggle fodls the element and persists the state in the db
|
95
|
+
#
|
96
|
+
# Ingredient validations might make the element invalid.
|
97
|
+
# In this case we are just toggling a UI state and do not care about the validations.
|
94
98
|
def fold
|
95
99
|
@page = @element.page
|
96
100
|
@element.folded = !@element.folded
|
97
|
-
@element.save
|
101
|
+
@element.save(validate: false)
|
98
102
|
end
|
99
103
|
|
100
104
|
private
|
@@ -28,7 +28,7 @@ module Alchemy
|
|
28
28
|
after_assign { |f| write_attribute(:file_mime_type, f.mime_type) }
|
29
29
|
end
|
30
30
|
|
31
|
-
stampable stamper_class_name: Alchemy.
|
31
|
+
stampable stamper_class_name: Alchemy.user_class.name
|
32
32
|
|
33
33
|
has_many :essence_files, class_name: "Alchemy::EssenceFile", foreign_key: "attachment_id"
|
34
34
|
has_many :contents, through: :essence_files
|
@@ -99,12 +99,12 @@ module Alchemy
|
|
99
99
|
# The ingredient that's used for element's preview text.
|
100
100
|
#
|
101
101
|
# It tries to find one of element's ingredients that is defined +as_element_title+.
|
102
|
-
# Takes element's first ingredient if no ingredient is defined +as_element_title+.
|
102
|
+
# Takes element's first defined ingredient if no ingredient is defined +as_element_title+.
|
103
103
|
#
|
104
104
|
# @return (Alchemy::Ingredient)
|
105
105
|
#
|
106
106
|
def preview_ingredient
|
107
|
-
@_preview_ingredient ||= ingredients.detect(&:preview_ingredient?) ||
|
107
|
+
@_preview_ingredient ||= ingredients.detect(&:preview_ingredient?) || first_ingredient_by_definition
|
108
108
|
end
|
109
109
|
|
110
110
|
private
|
@@ -122,6 +122,13 @@ module Alchemy
|
|
122
122
|
def preview_text_from_preview_ingredient(maxlength)
|
123
123
|
preview_ingredient&.preview_text(maxlength)
|
124
124
|
end
|
125
|
+
|
126
|
+
def first_ingredient_by_definition
|
127
|
+
return if ingredient_definitions.empty?
|
128
|
+
|
129
|
+
role = ingredient_definitions.first["role"]
|
130
|
+
ingredients.detect { |ingredient| ingredient.role == role }
|
131
|
+
end
|
125
132
|
end
|
126
133
|
end
|
127
134
|
end
|
@@ -57,7 +57,7 @@ module Alchemy
|
|
57
57
|
#
|
58
58
|
acts_as_list scope: [:page_version_id, :fixed, :parent_element_id]
|
59
59
|
|
60
|
-
stampable stamper_class_name: Alchemy.
|
60
|
+
stampable stamper_class_name: Alchemy.user_class.name
|
61
61
|
|
62
62
|
has_many :contents, dependent: :destroy, inverse_of: :element
|
63
63
|
|
data/app/models/alchemy/node.rb
CHANGED
@@ -7,7 +7,7 @@ module Alchemy
|
|
7
7
|
before_destroy :check_if_related_essence_nodes_present
|
8
8
|
|
9
9
|
acts_as_nested_set scope: "language_id", touch: true
|
10
|
-
stampable stamper_class_name: Alchemy.
|
10
|
+
stampable stamper_class_name: Alchemy.user_class.name
|
11
11
|
|
12
12
|
belongs_to :language, class_name: "Alchemy::Language"
|
13
13
|
belongs_to :page, class_name: "Alchemy::Page", optional: true, inverse_of: :nodes
|
data/app/models/alchemy/page.rb
CHANGED
@@ -110,7 +110,7 @@ module Alchemy
|
|
110
110
|
case_sensitive: false,
|
111
111
|
message: Alchemy.t("not a valid image")
|
112
112
|
|
113
|
-
stampable stamper_class_name: Alchemy.
|
113
|
+
stampable stamper_class_name: Alchemy.user_class.name
|
114
114
|
|
115
115
|
scope :named, ->(name) { where("#{table_name}.name LIKE ?", "%#{name}%") }
|
116
116
|
scope :recent, -> { where("#{table_name}.created_at > ?", Time.current - 24.hours).order(:created_at) }
|
@@ -54,7 +54,7 @@
|
|
54
54
|
<%= f.hidden_field :link_title, data: { link_title: true }, id: nil %>
|
55
55
|
<%= f.hidden_field :link_class_name, data: { link_class: true }, id: nil %>
|
56
56
|
<%= f.hidden_field :link_target, data: { link_target: true }, id: nil %>
|
57
|
-
<%= f.hidden_field :crop_from, data: { crop_from: true }, id:
|
58
|
-
<%= f.hidden_field :crop_size, data: { crop_size: true }, id:
|
57
|
+
<%= f.hidden_field :crop_from, data: { crop_from: true }, id: picture_editor.form_field_id(:crop_from) %>
|
58
|
+
<%= f.hidden_field :crop_size, data: { crop_size: true }, id: picture_editor.form_field_id(:crop_size) %>
|
59
59
|
<% end %>
|
60
60
|
<% end %>
|
data/config/brakeman.ignore
CHANGED
@@ -58,7 +58,7 @@
|
|
58
58
|
"check_name": "MassAssignment",
|
59
59
|
"message": "Specify exact keys allowed for mass assignment instead of using `permit!` which allows any keys",
|
60
60
|
"file": "app/controllers/alchemy/admin/resources_controller.rb",
|
61
|
-
"line":
|
61
|
+
"line": 209,
|
62
62
|
"link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
|
63
63
|
"code": "params.require(resource_handler.namespaced_resource_name).permit!",
|
64
64
|
"render_path": null,
|
@@ -86,7 +86,7 @@
|
|
86
86
|
"type": "controller",
|
87
87
|
"class": "Alchemy::Admin::ElementsController",
|
88
88
|
"method": "fold",
|
89
|
-
"line":
|
89
|
+
"line": 102,
|
90
90
|
"file": "app/controllers/alchemy/admin/elements_controller.rb",
|
91
91
|
"rendered": {
|
92
92
|
"name": "alchemy/admin/elements/fold",
|
@@ -109,7 +109,7 @@
|
|
109
109
|
"check_name": "MassAssignment",
|
110
110
|
"message": "Specify exact keys allowed for mass assignment instead of using `permit!` which allows any keys",
|
111
111
|
"file": "app/controllers/alchemy/admin/elements_controller.rb",
|
112
|
-
"line":
|
112
|
+
"line": 155,
|
113
113
|
"link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
|
114
114
|
"code": "params.fetch(:contents, {}).permit!",
|
115
115
|
"render_path": null,
|
@@ -122,6 +122,26 @@
|
|
122
122
|
"confidence": "Medium",
|
123
123
|
"note": "`Alchemy::Content` is a polymorphic association of any kind of model extending `Alchemy::Essence`. Since we can't know the attributes of all potential essences we need to permit all attributes. As this all happens inside the password protected /admin namespace this can be considered a false positive."
|
124
124
|
},
|
125
|
+
{
|
126
|
+
"warning_type": "Command Injection",
|
127
|
+
"warning_code": 14,
|
128
|
+
"fingerprint": "6addfcb9d23d2d6f699f2f3542169744ff749dc4d0a97f8ac783ab92593e1d84",
|
129
|
+
"check_name": "Execute",
|
130
|
+
"message": "Possible command injection",
|
131
|
+
"file": "lib/alchemy/upgrader.rb",
|
132
|
+
"line": 30,
|
133
|
+
"link": "https://brakemanscanner.org/docs/warning_types/command_injection/",
|
134
|
+
"code": "`yarn add @alchemy_cms/admin@~#{Alchemy.version}`",
|
135
|
+
"render_path": null,
|
136
|
+
"location": {
|
137
|
+
"type": "method",
|
138
|
+
"class": "Alchemy::Upgrader",
|
139
|
+
"method": "update_npm_package"
|
140
|
+
},
|
141
|
+
"user_input": "Alchemy.version",
|
142
|
+
"confidence": "Medium",
|
143
|
+
"note": "The alchemy version is safe"
|
144
|
+
},
|
125
145
|
{
|
126
146
|
"warning_type": "Cross-Site Scripting",
|
127
147
|
"warning_code": 4,
|
@@ -255,6 +275,6 @@
|
|
255
275
|
"note": ""
|
256
276
|
}
|
257
277
|
],
|
258
|
-
"updated": "2021-
|
259
|
-
"brakeman_version": "5.
|
278
|
+
"updated": "2021-10-26 21:44:59 +0200",
|
279
|
+
"brakeman_version": "5.1.1"
|
260
280
|
}
|
data/lib/alchemy/engine.rb
CHANGED
@@ -40,7 +40,7 @@ module Alchemy
|
|
40
40
|
if Alchemy.user_class
|
41
41
|
ActiveSupport.on_load(:active_record) do
|
42
42
|
Alchemy.user_class.model_stamper
|
43
|
-
Alchemy.user_class.stampable(stamper_class_name: Alchemy.
|
43
|
+
Alchemy.user_class.stampable(stamper_class_name: Alchemy.user_class.name)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
data/lib/alchemy/taggable.rb
CHANGED
@@ -22,13 +22,20 @@ module Alchemy
|
|
22
22
|
end
|
23
23
|
|
24
24
|
module ClassMethods
|
25
|
-
|
26
|
-
# Separate multiple tags by comma.
|
27
|
-
def tagged_with(names)
|
25
|
+
def tagged_with(names = [], **args)
|
28
26
|
if names.is_a? String
|
29
27
|
names = names.split(/,\s*/)
|
30
28
|
end
|
31
|
-
|
29
|
+
|
30
|
+
unless args[:match]
|
31
|
+
args.merge!(match: :all)
|
32
|
+
end
|
33
|
+
|
34
|
+
if names.any?
|
35
|
+
args.merge!(names: names)
|
36
|
+
end
|
37
|
+
|
38
|
+
super(args)
|
32
39
|
end
|
33
40
|
|
34
41
|
# Returns all unique tags
|
data/lib/alchemy/upgrader.rb
CHANGED
@@ -24,6 +24,12 @@ module Alchemy
|
|
24
24
|
todo "Check the default configuration file (./config/alchemy/config.yml.defaults) for new configuration options and insert them into your config file.", "Configuration has changed"
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def update_npm_package
|
29
|
+
desc "Install new npm package."
|
30
|
+
`yarn add @alchemy_cms/admin@~#{Alchemy.version}`
|
31
|
+
log "Installed new npm package."
|
32
|
+
end
|
27
33
|
end
|
28
34
|
end
|
29
35
|
end
|
data/lib/alchemy/version.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "rails/generators"
|
3
3
|
require "alchemy/install/tasks"
|
4
|
+
require "alchemy/version"
|
4
5
|
|
5
6
|
module Alchemy
|
6
7
|
module Generators
|
@@ -88,7 +89,7 @@ module Alchemy
|
|
88
89
|
end
|
89
90
|
|
90
91
|
def add_npm_package
|
91
|
-
run "yarn add @alchemy_cms/admin"
|
92
|
+
run "yarn add @alchemy_cms/admin@~#{Alchemy.version}"
|
92
93
|
end
|
93
94
|
|
94
95
|
def copy_alchemy_entry_point
|
@@ -17,6 +17,7 @@ namespace :alchemy do
|
|
17
17
|
task prepare: [
|
18
18
|
"alchemy:upgrade:database",
|
19
19
|
"alchemy:upgrade:config",
|
20
|
+
"alchemy:upgrade:package",
|
20
21
|
]
|
21
22
|
|
22
23
|
desc "Alchemy Upgrader: Prepares the database."
|
@@ -30,6 +31,11 @@ namespace :alchemy do
|
|
30
31
|
Alchemy::Upgrader.copy_new_config_file
|
31
32
|
end
|
32
33
|
|
34
|
+
desc "Alchemy Upgrader: Install new Node package."
|
35
|
+
task package: [:environment] do
|
36
|
+
Alchemy::Upgrader.update_npm_package
|
37
|
+
end
|
38
|
+
|
33
39
|
desc "Upgrade Alchemy to v5.0"
|
34
40
|
task "5.0" => [
|
35
41
|
"alchemy:upgrade:prepare",
|
data/package.json
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy_cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.0.pre.
|
4
|
+
version: 6.0.0.pre.rc3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas von Deyen
|
@@ -10,10 +10,10 @@ authors:
|
|
10
10
|
- Hendrik Mans
|
11
11
|
- Carsten Fregin
|
12
12
|
- Martin Meyerhoff
|
13
|
-
autorequire:
|
13
|
+
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2021-
|
16
|
+
date: 2021-11-24 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: actionmailer
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
version: '6.0'
|
25
25
|
- - "<"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '6.
|
27
|
+
version: '6.2'
|
28
28
|
type: :runtime
|
29
29
|
prerelease: false
|
30
30
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
version: '6.0'
|
35
35
|
- - "<"
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '6.
|
37
|
+
version: '6.2'
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: actionpack
|
40
40
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
version: '6.0'
|
45
45
|
- - "<"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '6.
|
47
|
+
version: '6.2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '6.0'
|
55
55
|
- - "<"
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version: '6.
|
57
|
+
version: '6.2'
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: actionview
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,7 +64,7 @@ dependencies:
|
|
64
64
|
version: '6.0'
|
65
65
|
- - "<"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '6.
|
67
|
+
version: '6.2'
|
68
68
|
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
version: '6.0'
|
75
75
|
- - "<"
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: '6.
|
77
|
+
version: '6.2'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: activejob
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,7 +84,7 @@ dependencies:
|
|
84
84
|
version: '6.0'
|
85
85
|
- - "<"
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version: '6.
|
87
|
+
version: '6.2'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -94,7 +94,7 @@ dependencies:
|
|
94
94
|
version: '6.0'
|
95
95
|
- - "<"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: '6.
|
97
|
+
version: '6.2'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: activemodel
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,7 +104,7 @@ dependencies:
|
|
104
104
|
version: '6.0'
|
105
105
|
- - "<"
|
106
106
|
- !ruby/object:Gem::Version
|
107
|
-
version: '6.
|
107
|
+
version: '6.2'
|
108
108
|
type: :runtime
|
109
109
|
prerelease: false
|
110
110
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -114,7 +114,7 @@ dependencies:
|
|
114
114
|
version: '6.0'
|
115
115
|
- - "<"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '6.
|
117
|
+
version: '6.2'
|
118
118
|
- !ruby/object:Gem::Dependency
|
119
119
|
name: activerecord
|
120
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,7 +124,7 @@ dependencies:
|
|
124
124
|
version: '6.0'
|
125
125
|
- - "<"
|
126
126
|
- !ruby/object:Gem::Version
|
127
|
-
version: '6.
|
127
|
+
version: '6.2'
|
128
128
|
type: :runtime
|
129
129
|
prerelease: false
|
130
130
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -134,7 +134,7 @@ dependencies:
|
|
134
134
|
version: '6.0'
|
135
135
|
- - "<"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: '6.
|
137
|
+
version: '6.2'
|
138
138
|
- !ruby/object:Gem::Dependency
|
139
139
|
name: activesupport
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,7 +144,7 @@ dependencies:
|
|
144
144
|
version: '6.0'
|
145
145
|
- - "<"
|
146
146
|
- !ruby/object:Gem::Version
|
147
|
-
version: '6.
|
147
|
+
version: '6.2'
|
148
148
|
type: :runtime
|
149
149
|
prerelease: false
|
150
150
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -154,7 +154,7 @@ dependencies:
|
|
154
154
|
version: '6.0'
|
155
155
|
- - "<"
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version: '6.
|
157
|
+
version: '6.2'
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
159
|
name: railties
|
160
160
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,7 +164,7 @@ dependencies:
|
|
164
164
|
version: '6.0'
|
165
165
|
- - "<"
|
166
166
|
- !ruby/object:Gem::Version
|
167
|
-
version: '6.
|
167
|
+
version: '6.2'
|
168
168
|
type: :runtime
|
169
169
|
prerelease: false
|
170
170
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -174,7 +174,7 @@ dependencies:
|
|
174
174
|
version: '6.0'
|
175
175
|
- - "<"
|
176
176
|
- !ruby/object:Gem::Version
|
177
|
-
version: '6.
|
177
|
+
version: '6.2'
|
178
178
|
- !ruby/object:Gem::Dependency
|
179
179
|
name: active_model_serializers
|
180
180
|
requirement: !ruby/object:Gem::Requirement
|
@@ -571,6 +571,20 @@ dependencies:
|
|
571
571
|
- - "~>"
|
572
572
|
- !ruby/object:Gem::Version
|
573
573
|
version: '1.0'
|
574
|
+
- !ruby/object:Gem::Dependency
|
575
|
+
name: cuprite
|
576
|
+
requirement: !ruby/object:Gem::Requirement
|
577
|
+
requirements:
|
578
|
+
- - "~>"
|
579
|
+
- !ruby/object:Gem::Version
|
580
|
+
version: '0.13'
|
581
|
+
type: :development
|
582
|
+
prerelease: false
|
583
|
+
version_requirements: !ruby/object:Gem::Requirement
|
584
|
+
requirements:
|
585
|
+
- - "~>"
|
586
|
+
- !ruby/object:Gem::Version
|
587
|
+
version: '0.13'
|
574
588
|
- !ruby/object:Gem::Dependency
|
575
589
|
name: factory_bot_rails
|
576
590
|
requirement: !ruby/object:Gem::Requirement
|
@@ -655,20 +669,6 @@ dependencies:
|
|
655
669
|
- - "~>"
|
656
670
|
- !ruby/object:Gem::Version
|
657
671
|
version: '0.20'
|
658
|
-
- !ruby/object:Gem::Dependency
|
659
|
-
name: webdrivers
|
660
|
-
requirement: !ruby/object:Gem::Requirement
|
661
|
-
requirements:
|
662
|
-
- - "~>"
|
663
|
-
- !ruby/object:Gem::Version
|
664
|
-
version: '4.0'
|
665
|
-
type: :development
|
666
|
-
prerelease: false
|
667
|
-
version_requirements: !ruby/object:Gem::Requirement
|
668
|
-
requirements:
|
669
|
-
- - "~>"
|
670
|
-
- !ruby/object:Gem::Version
|
671
|
-
version: '4.0'
|
672
672
|
- !ruby/object:Gem::Dependency
|
673
673
|
name: webmock
|
674
674
|
requirement: !ruby/object:Gem::Requirement
|
@@ -724,6 +724,7 @@ files:
|
|
724
724
|
- ".github/ISSUE_TEMPLATE/Bug_report.md"
|
725
725
|
- ".github/ISSUE_TEMPLATE/Feature_request.md"
|
726
726
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
727
|
+
- ".github/workflows/brakeman-analysis.yml"
|
727
728
|
- ".github/workflows/ci.yml"
|
728
729
|
- ".github/workflows/stale.yml"
|
729
730
|
- ".gitignore"
|
@@ -739,6 +740,7 @@ files:
|
|
739
740
|
- LICENSE
|
740
741
|
- README.md
|
741
742
|
- Rakefile
|
743
|
+
- SECURITY.md
|
742
744
|
- alchemy_cms.gemspec
|
743
745
|
- app/assets/config/alchemy_manifest.js
|
744
746
|
- app/assets/images/alchemy/alchemy-logo.png
|
@@ -1517,7 +1519,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1517
1519
|
requirements:
|
1518
1520
|
- ImageMagick (libmagick), v6.6 or greater.
|
1519
1521
|
rubygems_version: 3.1.6
|
1520
|
-
signing_key:
|
1522
|
+
signing_key:
|
1521
1523
|
specification_version: 4
|
1522
1524
|
summary: A powerful, userfriendly and flexible CMS for Rails
|
1523
1525
|
test_files: []
|
1526
|
+
...
|