-
-
Notifications
You must be signed in to change notification settings - Fork 75
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Branch: refs/heads/main Date: 2024-10-16T08:32:56-07:00 Author: jackahl (jackahl) <[email protected]> Commit: plone/plone.restapi@b9a56e1 Use existing aliases controlpanel permissions for aliases endpoint (#1825) * Use exisitng aliases controlpanel permissions for aliases endpoint * Use ManagePortalAliases for alias delete endpoint on siteroot Co-authored-by: David Glick <[email protected]> * Update news/1820.bugfix --------- Co-authored-by: David Glick <[email protected]> Files changed: A news/1820.bugfix M src/plone/restapi/services/aliases/configure.zcml
- Loading branch information
Showing
1 changed file
with
20 additions
and
93 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,101 +1,28 @@ | ||
Repository: Products.CMFPlone | ||
Repository: plone.restapi | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2024-10-09T09:14:34+02:00 | ||
Author: Peter Mathis (petschki) <[email protected]> | ||
Commit: https://github.com/plone/Products.CMFPlone/commit/8a83d04f3c486844251887027b5d8c291e3d76db | ||
Branch: refs/heads/main | ||
Date: 2024-10-16T08:32:56-07:00 | ||
Author: jackahl (jackahl) <[email protected]> | ||
Commit: https://github.com/plone/plone.restapi/commit/b9a56e1930748da15351b90d502304ca17a0ac5e | ||
|
||
Respect new strict parsing of `email.utils.getaddresses` | ||
Use existing aliases controlpanel permissions for aliases endpoint (#1825) | ||
|
||
Files changed: | ||
M Products/CMFPlone/PloneTool.py | ||
M Products/CMFPlone/tests/testPloneTool.py | ||
|
||
b'diff --git a/Products/CMFPlone/PloneTool.py b/Products/CMFPlone/PloneTool.py\nindex 0c549327a2..3f4e12da1c 100644\n--- a/Products/CMFPlone/PloneTool.py\n+++ b/Products/CMFPlone/PloneTool.py\n@@ -142,6 +142,10 @@ def validateSingleNormalizedEmailAddress(self, address):\n # Address contains two newlines (possible spammer relay attack)\n return False\n \n+ # address can be empty if getaddresses has parsing errors (returns [("", "")])\n+ if address == "":\n+ return False\n+\n # sub is an empty string if the address is valid\n sub = EMAIL_RE.sub("", address)\n if sub == "":\ndiff --git a/Products/CMFPlone/tests/testPloneTool.py b/Products/CMFPlone/tests/testPloneTool.py\nindex 3e3be2c3ea..23a9120794 100644\n--- a/Products/CMFPlone/tests/testPloneTool.py\n+++ b/Products/CMFPlone/tests/testPloneTool.py\n@@ -74,7 +74,6 @@ def testvalidateEmailAddresses(self):\n validInputs = (\n "[email protected]",\n "[email protected],\\n [email protected]",\n- "[email protected]\\n [email protected]", # omitting comma is ok\n "[email protected],\\n [email protected]",\n )\n invalidInputs = (\n' | ||
|
||
Repository: Products.CMFPlone | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2024-10-09T09:14:34+02:00 | ||
Author: Peter Mathis (petschki) <[email protected]> | ||
Commit: https://github.com/plone/Products.CMFPlone/commit/ad9586997d91e06e7be57b300bbe46950f0b7365 | ||
|
||
changenote | ||
|
||
Files changed: | ||
A news/4020.bugfix | ||
|
||
b'diff --git a/news/4020.bugfix b/news/4020.bugfix\nnew file mode 100644\nindex 0000000000..e9cc73c207\n--- /dev/null\n+++ b/news/4020.bugfix\n@@ -0,0 +1,2 @@\n+Update for strict parsing in `email.utils.getaddresses` newest versions.\n+[petschki]\n' | ||
|
||
Repository: Products.CMFPlone | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2024-10-09T10:35:35+02:00 | ||
Author: Peter Mathis (petschki) <[email protected]> | ||
Commit: https://github.com/plone/Products.CMFPlone/commit/7de69a11006053849916f290c26e0db0cd1d28b9 | ||
|
||
cleanup address and check early for empty value | ||
|
||
Files changed: | ||
M Products/CMFPlone/PloneTool.py | ||
|
||
b'diff --git a/Products/CMFPlone/PloneTool.py b/Products/CMFPlone/PloneTool.py\nindex 3f4e12da1c..85f28e820e 100644\n--- a/Products/CMFPlone/PloneTool.py\n+++ b/Products/CMFPlone/PloneTool.py\n@@ -137,15 +137,17 @@ def validateSingleNormalizedEmailAddress(self, address):\n if not isinstance(address, str):\n return False\n \n- sub = EMAIL_CUTOFF_RE.match(address)\n- if sub is not None:\n- # Address contains two newlines (possible spammer relay attack)\n- return False\n+ address = address.strip()\n \n # address can be empty if getaddresses has parsing errors (returns [("", "")])\n if address == "":\n return False\n \n+ sub = EMAIL_CUTOFF_RE.match(address)\n+ if sub is not None:\n+ # Address contains two newlines (possible spammer relay attack)\n+ return False\n+\n # sub is an empty string if the address is valid\n sub = EMAIL_RE.sub("", address)\n if sub == "":\n' | ||
|
||
Repository: Products.CMFPlone | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2024-10-14T14:25:26+02:00 | ||
Author: Peter Mathis (petschki) <[email protected]> | ||
Commit: https://github.com/plone/Products.CMFPlone/commit/1d45a8de120c713e8793fb5f66ac59adb9e2e0ff | ||
|
||
Merge branch 'master' into getaddresses_strict_parsing_fix | ||
|
||
Files changed: | ||
A news/4022.bugfix | ||
A news/4028.bugfix | ||
M Products/CMFPlone/controlpanel/browser/configure.zcml | ||
M Products/CMFPlone/controlpanel/permissions.zcml | ||
M Products/CMFPlone/resources/utils.py | ||
M Products/CMFPlone/tests/testResourceRegistries.py | ||
|
||
b'diff --git a/Products/CMFPlone/controlpanel/browser/configure.zcml b/Products/CMFPlone/controlpanel/browser/configure.zcml\nindex 1a8231c590..7cca9f0b3a 100644\n--- a/Products/CMFPlone/controlpanel/browser/configure.zcml\n+++ b/Products/CMFPlone/controlpanel/browser/configure.zcml\n@@ -4,18 +4,6 @@\n xmlns:zcml="http://namespaces.zope.org/zcml"\n >\n \n- <permission\n- id="plone.app.controlpanel.Imaging"\n- title="Plone Site Setup: Imaging"\n- />\n-\n- <permission\n- id="plone.app.controlpanel.TinyMCE"\n- title="Plone Site Setup: TinyMCE"\n- >\n- <role name="Manager" />\n- </permission>\n-\n <!-- Control Panel Main Template -->\n <browser:page\n name="prefs_main_template"\n@@ -325,16 +313,6 @@\n permission="cmf.ManagePortal"\n />\n \n- <permission\n- id="Products.CMFPlone.ManagePortalAliases"\n- title="Manage Portal Aliases"\n- />\n-\n- <permission\n- id="Products.CMFPlone.ManageContextAliases"\n- title="Manage Context Aliases"\n- />\n-\n <browser:page\n name="redirection-controlpanel"\n for="plone.base.interfaces.IPloneSiteRoot"\ndiff --git a/Products/CMFPlone/controlpanel/permissions.zcml b/Products/CMFPlone/controlpanel/permissions.zcml\nindex be7eda7479..a701cf634b 100644\n--- a/Products/CMFPlone/controlpanel/permissions.zcml\n+++ b/Products/CMFPlone/controlpanel/permissions.zcml\n@@ -67,4 +67,26 @@\n <role name="Manager" />\n </permission>\n \n+ <permission\n+ id="plone.app.controlpanel.Imaging"\n+ title="Plone Site Setup: Imaging"\n+ />\n+\n+ <permission\n+ id="plone.app.controlpanel.TinyMCE"\n+ title="Plone Site Setup: TinyMCE"\n+ >\n+ <role name="Manager" />\n+ </permission>\n+\n+ <permission\n+ id="Products.CMFPlone.ManagePortalAliases"\n+ title="Manage Portal Aliases"\n+ />\n+\n+ <permission\n+ id="Products.CMFPlone.ManageContextAliases"\n+ title="Manage Context Aliases"\n+ />\n+\n </configure>\ndiff --git a/Products/CMFPlone/resources/utils.py b/Products/CMFPlone/resources/utils.py\nindex a0632ec8dc..4cbb8bbf67 100644\n--- a/Products/CMFPlone/resources/utils.py\n+++ b/Products/CMFPlone/resources/utils.py\n@@ -1,6 +1,7 @@\n from Acquisition import aq_base\n from Acquisition import aq_inner\n from Acquisition import aq_parent\n+from OFS.Image import File\n from plone.base.interfaces.resources import OVERRIDE_RESOURCE_DIRECTORY_NAME\n from plone.resource.file import FilesystemFile\n from plone.resource.interfaces import IResourceDirectory\n@@ -75,9 +76,15 @@ def get_resource(context, path):\n if hasattr(aq_base(resource), "GET"):\n # for FileResource\n result = resource.GET()\n- else:\n+ elif isinstance(resource, File):\n+ # An OFS.Image.File object\n+ result = resource.data\n+ elif callable(resource):\n # any BrowserView\n result = resource()\n+ else:\n+ logger.info("Cannot get data from resource %r", resource)\n+ result = b""\n context.REQUEST.response = response_before\n return result\n \ndiff --git a/Products/CMFPlone/tests/testResourceRegistries.py b/Products/CMFPlone/tests/testResourceRegistries.py\nindex 12021ceb0a..235ba8cf87 100644\n--- a/Products/CMFPlone/tests/testResourceRegistries.py\n+++ b/Products/CMFPlone/tests/testResourceRegistries.py\n@@ -1,3 +1,4 @@\n+from OFS.Image import File\n from plone.app.testing import logout\n from plone.app.testing import setRoles\n from plone.app.testing import SITE_OWNER_NAME\n@@ -13,6 +14,7 @@\n from Products.CMFPlone.resources.browser.resource import REQUEST_CACHE_KEY\n from Products.CMFPlone.resources.browser.resource import ScriptsView\n from Products.CMFPlone.resources.browser.resource import StylesView\n+from Products.CMFPlone.resources.webresource import PloneScriptResource\n from Products.CMFPlone.tests import PloneTestCase\n from zope.component import getUtility\n \n@@ -180,6 +182,30 @@ def test_bundle_depends_on_missing(self):\n # bundle should be skipped when rendering\n self.assertNotIn("http://foo.bar/foobar.js", results)\n \n+ def test_resource_browser_static_resource(self):\n+ resource = PloneScriptResource(self.portal, resource="++resource++plone-admin-ui.js")\n+ self.assertIn(\n+ b"window.onload", resource.file_data,\n+ )\n+\n+ def test_resource_ofs_file(self):\n+ self.portal["foo.js"] = File("foo.js", "Title", b\'console.log()\')\n+ resource = PloneScriptResource(self.portal, resource="foo.js")\n+ self.assertEqual(\n+ resource.file_data, b\'console.log()\',\n+ )\n+\n+ def test_resource_view(self):\n+ resource = PloneScriptResource(self.portal, resource="@@ok")\n+ self.assertEqual(\n+ resource.file_data, b\'OK\',\n+ )\n+\n+ def test_resource_bogus(self):\n+ resource = PloneScriptResource(self.portal, resource="I_do_not_exist")\n+ self.assertEqual(\n+ resource.file_data, b\'I_do_not_exist\',\n+ )\n \n class TestStylesViewlet(PloneTestCase.PloneTestCase):\n def test_styles_viewlet(self):\ndiff --git a/news/4022.bugfix b/news/4022.bugfix\nnew file mode 100644\nindex 0000000000..292aac9553\n--- /dev/null\n+++ b/news/4022.bugfix\n@@ -0,0 +1,2 @@\n+Resource registry: Support OFS.Image.File objects.\n+[ale-rt, thet]\ndiff --git a/news/4028.bugfix b/news/4028.bugfix\nnew file mode 100644\nindex 0000000000..d0916ccdf0\n--- /dev/null\n+++ b/news/4028.bugfix\n@@ -0,0 +1,2 @@\n+move all permission definitions for controlpanels to unifed file from controlpanel directory\n+[jackahl]\n' | ||
|
||
Repository: Products.CMFPlone | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2024-10-16T08:29:26+02:00 | ||
Author: Peter Mathis (petschki) <[email protected]> | ||
Commit: https://github.com/plone/Products.CMFPlone/commit/53a22d299a41f44fe6546098e670c7cfe84b3be4 | ||
|
||
Merge branch 'master' into getaddresses_strict_parsing_fix | ||
|
||
Files changed: | ||
A news/4026.bugfix | ||
M Products/CMFPlone/Portal.py | ||
|
||
b'diff --git a/Products/CMFPlone/Portal.py b/Products/CMFPlone/Portal.py\nindex cbf4c91149..878872e666 100644\n--- a/Products/CMFPlone/Portal.py\n+++ b/Products/CMFPlone/Portal.py\n@@ -61,7 +61,7 @@ def __getattr__(self, name):\n \n def __setattr__(self, name, obj):\n # handle re setting an item as an attribute\n- if self._tree is not None and name in self:\n+ if not name.startswith("_") and self._tree is not None and name in self:\n del self[name]\n self[name] = obj\n else:\ndiff --git a/news/4026.bugfix b/news/4026.bugfix\nnew file mode 100644\nindex 0000000000..a51ab29b2e\n--- /dev/null\n+++ b/news/4026.bugfix\n@@ -0,0 +1 @@\n+Avoid POSKeyError when commit occurs and we have savepoint that involves Plone Site. @wesleybl\n' | ||
|
||
Repository: Products.CMFPlone | ||
|
||
|
||
Branch: refs/heads/master | ||
Date: 2024-10-16T16:20:15+02:00 | ||
Author: Peter Mathis (petschki) <[email protected]> | ||
Commit: https://github.com/plone/Products.CMFPlone/commit/abd111b8b67b8c3c73ed9fd36f3b6cfb60dff81b | ||
|
||
Merge pull request #4023 from plone/getaddresses_strict_parsing_fix | ||
|
||
Respect new strict parsing of `email.utils.getaddresses` | ||
* Use exisitng aliases controlpanel permissions for aliases endpoint | ||
|
||
* Use ManagePortalAliases for alias delete endpoint on siteroot | ||
|
||
Co-authored-by: David Glick <[email protected]> | ||
|
||
* Update news/1820.bugfix | ||
|
||
--------- | ||
|
||
Co-authored-by: David Glick <[email protected]> | ||
|
||
Files changed: | ||
A news/4020.bugfix | ||
M Products/CMFPlone/PloneTool.py | ||
M Products/CMFPlone/tests/testPloneTool.py | ||
A news/1820.bugfix | ||
M src/plone/restapi/services/aliases/configure.zcml | ||
|
||
b'diff --git a/Products/CMFPlone/PloneTool.py b/Products/CMFPlone/PloneTool.py\nindex 0c549327a2..85f28e820e 100644\n--- a/Products/CMFPlone/PloneTool.py\n+++ b/Products/CMFPlone/PloneTool.py\n@@ -137,6 +137,12 @@ def validateSingleNormalizedEmailAddress(self, address):\n if not isinstance(address, str):\n return False\n \n+ address = address.strip()\n+\n+ # address can be empty if getaddresses has parsing errors (returns [("", "")])\n+ if address == "":\n+ return False\n+\n sub = EMAIL_CUTOFF_RE.match(address)\n if sub is not None:\n # Address contains two newlines (possible spammer relay attack)\ndiff --git a/Products/CMFPlone/tests/testPloneTool.py b/Products/CMFPlone/tests/testPloneTool.py\nindex 3e3be2c3ea..23a9120794 100644\n--- a/Products/CMFPlone/tests/testPloneTool.py\n+++ b/Products/CMFPlone/tests/testPloneTool.py\n@@ -74,7 +74,6 @@ def testvalidateEmailAddresses(self):\n validInputs = (\n "[email protected]",\n "[email protected],\\n [email protected]",\n- "[email protected]\\n [email protected]", # omitting comma is ok\n "[email protected],\\n [email protected]",\n )\n invalidInputs = (\ndiff --git a/news/4020.bugfix b/news/4020.bugfix\nnew file mode 100644\nindex 0000000000..e9cc73c207\n--- /dev/null\n+++ b/news/4020.bugfix\n@@ -0,0 +1,2 @@\n+Update for strict parsing in `email.utils.getaddresses` newest versions.\n+[petschki]\n' | ||
b'diff --git a/news/1820.bugfix b/news/1820.bugfix\nnew file mode 100644\nindex 000000000..8f2aeaaf4\n--- /dev/null\n+++ b/news/1820.bugfix\n@@ -0,0 +1 @@\n+Aliases endpoint: Use "Manage Portal Aliases" and "Manage Content Aliases" permissions. @jackahl\ndiff --git a/src/plone/restapi/services/aliases/configure.zcml b/src/plone/restapi/services/aliases/configure.zcml\nindex c6499d117..b68d1050c 100644\n--- a/src/plone/restapi/services/aliases/configure.zcml\n+++ b/src/plone/restapi/services/aliases/configure.zcml\n@@ -8,7 +8,7 @@\n accept="application/json,application/schema+json"\n factory=".get.AliasesGet"\n for="Products.CMFPlone.interfaces.IPloneSiteRoot"\n- permission="zope2.View"\n+ permission="Products.CMFPlone.ManagePortalAliases"\n name="@aliases"\n />\n \n@@ -17,7 +17,7 @@\n accept="text/csv"\n factory=".get.AliasesGet"\n for="Products.CMFPlone.interfaces.IPloneSiteRoot"\n- permission="zope2.View"\n+ permission="Products.CMFPlone.ManagePortalAliases"\n name="@aliases"\n />\n \n@@ -26,7 +26,7 @@\n accept="application/json,application/schema+json"\n factory=".get.AliasesGet"\n for="Products.CMFCore.interfaces.IContentish"\n- permission="zope2.View"\n+ permission="Products.CMFPlone.ManageContextAliases"\n name="@aliases"\n />\n \n@@ -34,7 +34,7 @@\n method="POST"\n factory=".add.AliasesPost"\n for="*"\n- permission="cmf.ModifyPortalContent"\n+ permission="Products.CMFPlone.ManageContextAliases"\n name="@aliases"\n />\n \n@@ -42,7 +42,7 @@\n method="POST"\n factory=".add.AliasesRootPost"\n for="Products.CMFPlone.interfaces.IPloneSiteRoot"\n- permission="cmf.ModifyPortalContent"\n+ permission="Products.CMFPlone.ManagePortalAliases"\n name="@aliases"\n />\n \n@@ -50,7 +50,7 @@\n method="DELETE"\n factory=".delete.AliasesDelete"\n for="*"\n- permission="cmf.ModifyPortalContent"\n+ permission="Products.CMFPlone.ManageContextAliases"\n name="@aliases"\n />\n \n@@ -58,7 +58,7 @@\n method="DELETE"\n factory=".delete.AliasesDelete"\n for="Products.CMFPlone.interfaces.IPloneSiteRoot"\n- permission="cmf.ModifyPortalContent"\n+ permission="Products.CMFPlone.ManagePortalAliases"\n name="@aliases"\n />\n \n' | ||
|