alchemy_cms 7.4.14 → 7.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/Gemfile +1 -0
- data/app/controllers/alchemy/api/nodes_controller.rb +1 -1
- data/app/controllers/alchemy/api/pages_controller.rb +2 -0
- data/app/models/alchemy/node.rb +21 -0
- data/app/serializers/alchemy/page_tree_serializer.rb +17 -1
- data/app/views/alchemy/admin/pictures/_form.html.erb +1 -1
- data/lib/alchemy/permissions.rb +10 -0
- data/lib/alchemy/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d0a06fcd96871af12f69f0fc6ce8fca812e488cb8f237422b0d96d698b93e5d0
|
|
4
|
+
data.tar.gz: 9efa2b94685991f66d48f4a252b7386003e351a3f13c6ff4edfe4e020eb54ffc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 249f19b6adb1ac0e372969eeea89c475410490da05bb29d01450efd38b4c58d8ab4d819956391956ce8bc8fcc660b872cdf4793ffe17a5b0dee386d18cbb910a
|
|
7
|
+
data.tar.gz: 9ac152930b4533aa7598c069864f77f56d72178a56f114496d6fee66220639b84dc8aaf648d70e8b86bac79ab3ae201b5b9154094ef2a9dfc5dee8c4d7de7dd9
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 7.4.16 (2026-07-28)
|
|
4
|
+
|
|
5
|
+
## What's Changed
|
|
6
|
+
* [7.4] authorize nodes#index to prevent navigation tree disclosure by @tvdeyen in https://github.com/AlchemyCMS/alchemy_cms/pull/4099
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
**Full Changelog**: https://github.com/AlchemyCMS/alchemy_cms/compare/v7.4.15...v7.4.16
|
|
10
|
+
|
|
11
|
+
## 7.4.15 (2026-06-18)
|
|
12
|
+
|
|
13
|
+
## What's Changed
|
|
14
|
+
* [7.4] Fix double form submission in picture overlay by @tvdeyen in https://github.com/AlchemyCMS/alchemy_cms/pull/3825
|
|
15
|
+
* [7.4] fix(api): authorize nested pages endpoint against restricted content by @tvdeyen in https://github.com/AlchemyCMS/alchemy_cms/pull/3983
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
**Full Changelog**: https://github.com/AlchemyCMS/alchemy_cms/compare/v7.4.14...v7.4.15
|
|
19
|
+
|
|
3
20
|
## 7.4.14 (2026-03-26)
|
|
4
21
|
|
|
5
22
|
## What's Changed
|
data/Gemfile
CHANGED
|
@@ -16,6 +16,7 @@ end
|
|
|
16
16
|
gem "pg", "~> 1.0" if ENV["DB"] == "postgresql"
|
|
17
17
|
|
|
18
18
|
gem "alchemy_i18n", git: "https://github.com/AlchemyCMS/alchemy_i18n.git", branch: "4.2-stable"
|
|
19
|
+
gem "i18n", "< 1.15" # >= 1.15 needs Ruby 3.2, but we still support Ruby 3.1
|
|
19
20
|
|
|
20
21
|
group :development, :test do
|
|
21
22
|
gem "execjs", "~> 2.9.1"
|
|
@@ -6,7 +6,7 @@ module Alchemy
|
|
|
6
6
|
before_action :authorize_access, only: [:move, :toggle_folded]
|
|
7
7
|
|
|
8
8
|
def index
|
|
9
|
-
@nodes = Node.
|
|
9
|
+
@nodes = Node.accessible_by(current_ability, :index)
|
|
10
10
|
@nodes = @nodes.includes(:parent)
|
|
11
11
|
@nodes = @nodes.where(language_id: params[:language_id]) if params[:language_id]
|
|
12
12
|
@nodes = @nodes.ransack(params[:filter]).result.order(:lft)
|
data/app/models/alchemy/node.rb
CHANGED
|
@@ -19,6 +19,27 @@ module Alchemy
|
|
|
19
19
|
foreign_key: :related_object_id,
|
|
20
20
|
inverse_of: :related_object
|
|
21
21
|
|
|
22
|
+
# All nodes of the current site whose language is published.
|
|
23
|
+
scope :from_current_public_site, -> {
|
|
24
|
+
joins(:language)
|
|
25
|
+
.where(Alchemy::Language.table_name => {site_id: Alchemy::Current.site})
|
|
26
|
+
.merge(Alchemy::Language.published)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Nodes an anonymous visitor may see: external links or nodes attached to a
|
|
30
|
+
# published, unrestricted page, scoped to the current site.
|
|
31
|
+
scope :available_to_guests, -> {
|
|
32
|
+
from_current_public_site.where(page: nil)
|
|
33
|
+
.or(from_current_public_site.where(page: Alchemy::Page.published.not_restricted))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Like #available_to_guests but including nodes attached to restricted pages,
|
|
37
|
+
# which logged in members are allowed to see.
|
|
38
|
+
scope :available_to_members, -> {
|
|
39
|
+
from_current_public_site.where(page: nil)
|
|
40
|
+
.or(from_current_public_site.where(page: Alchemy::Page.published))
|
|
41
|
+
}
|
|
42
|
+
|
|
22
43
|
before_validation :translate_root_menu_name, if: -> { root? }
|
|
23
44
|
before_validation :set_menu_type_from_root, unless: -> { root? }
|
|
24
45
|
|
|
@@ -9,7 +9,21 @@ module Alchemy
|
|
|
9
9
|
def pages
|
|
10
10
|
tree = []
|
|
11
11
|
path = [{id: object.parent_id, children: tree}]
|
|
12
|
-
page_list = object.self_and_descendants
|
|
12
|
+
page_list = object.self_and_descendants
|
|
13
|
+
.accessible_by(opts[:ability], :read)
|
|
14
|
+
.includes(:public_version, {language: :site})
|
|
15
|
+
.to_a
|
|
16
|
+
# Drop pages whose parent was filtered out by the ability, so a
|
|
17
|
+
# restricted or unpublished branch does not leak its accessible
|
|
18
|
+
# descendants. self_and_descendants is ordered pre-order, so a parent
|
|
19
|
+
# always precedes its children and a single pass is sufficient.
|
|
20
|
+
kept_ids = Set.new([object.id])
|
|
21
|
+
page_list = page_list.select do |page|
|
|
22
|
+
next true if page.id == object.id
|
|
23
|
+
kept_ids.include?(page.parent_id).tap do |kept|
|
|
24
|
+
kept_ids << page.id if kept
|
|
25
|
+
end
|
|
26
|
+
end
|
|
13
27
|
base_level = object.level - 1
|
|
14
28
|
# Load folded pages in advance
|
|
15
29
|
folded_user_pages = FoldedPage.folded_for_user(opts[:user]).pluck(:page_id)
|
|
@@ -83,6 +97,8 @@ module Alchemy
|
|
|
83
97
|
end
|
|
84
98
|
|
|
85
99
|
def page_elements(page)
|
|
100
|
+
return Alchemy::Element.none unless opts[:ability].can?(:read, page)
|
|
101
|
+
|
|
86
102
|
elements = page.public_version&.elements || Alchemy::Element.none
|
|
87
103
|
if opts[:elements] == "true"
|
|
88
104
|
elements
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<%= turbo_frame_tag(@picture) do %>
|
|
2
|
-
<%= alchemy_form_for [alchemy, :admin, @picture] do |f| %>
|
|
2
|
+
<%= alchemy_form_for [alchemy, :admin, @picture], remote: false do |f| %>
|
|
3
3
|
<%= f.input :name %>
|
|
4
4
|
<%= render "alchemy/admin/pictures/picture_description_field", f: f %>
|
|
5
5
|
<%= render Alchemy::Admin::TagsAutocomplete.new(additional_class: "input") do %>
|
data/lib/alchemy/permissions.rb
CHANGED
|
@@ -44,6 +44,11 @@ module Alchemy
|
|
|
44
44
|
can :read, Alchemy::Page, Alchemy::Page.published.not_restricted.from_current_site do |p|
|
|
45
45
|
p.public? && !p.restricted? && p.site == Alchemy::Current.site
|
|
46
46
|
end
|
|
47
|
+
|
|
48
|
+
can :read, Alchemy::Node, Alchemy::Node.available_to_guests do |node|
|
|
49
|
+
node.language.public? && node.language.site_id == Alchemy::Current.site&.id &&
|
|
50
|
+
(node.page.nil? || (node.page.public? && !node.page.restricted?))
|
|
51
|
+
end
|
|
47
52
|
end
|
|
48
53
|
end
|
|
49
54
|
|
|
@@ -67,6 +72,11 @@ module Alchemy
|
|
|
67
72
|
can :read, Alchemy::Page, Alchemy::Page.published.from_current_site do |p|
|
|
68
73
|
p.public? && p.site == Alchemy::Current.site
|
|
69
74
|
end
|
|
75
|
+
|
|
76
|
+
can :read, Alchemy::Node, Alchemy::Node.available_to_members do |node|
|
|
77
|
+
node.language.public? && node.language.site_id == Alchemy::Current.site&.id &&
|
|
78
|
+
(node.page.nil? || node.page.public?)
|
|
79
|
+
end
|
|
70
80
|
end
|
|
71
81
|
end
|
|
72
82
|
|
data/lib/alchemy/version.rb
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: 7.4.
|
|
4
|
+
version: 7.4.16
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas von Deyen
|
|
@@ -1409,7 +1409,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
1409
1409
|
version: '0'
|
|
1410
1410
|
requirements:
|
|
1411
1411
|
- ImageMagick (libmagick), v6.6 or greater.
|
|
1412
|
-
rubygems_version: 4.0.
|
|
1412
|
+
rubygems_version: 4.0.16
|
|
1413
1413
|
specification_version: 4
|
|
1414
1414
|
summary: A powerful, userfriendly and flexible CMS for Rails
|
|
1415
1415
|
test_files: []
|