Skip to content

Commit

Permalink
Customize INameChooser adapter to check also alias ids and disallow t… (
Browse files Browse the repository at this point in the history
#101)

* Customize INameChooser adapter to check also alias ids and disallow to create contents that could override aliases
* black and isort
* zpretty
  • Loading branch information
cekk committed Mar 25, 2024
1 parent 0bd25bd commit ff608ee
Show file tree
Hide file tree
Showing 9 changed files with 331 additions and 20 deletions.
5 changes: 4 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ Changelog
5.4.9 (unreleased)
------------------

- Nothing changed yet.
- Customize INameChooser adapter to check also alias ids and disallow to create contents that could override aliases.
[cekk]
- Add flag in controlpanel to enable/disable INameChooser customization.
[cekk]


5.4.8 (2024-03-19)
Expand Down
11 changes: 11 additions & 0 deletions src/redturtle/volto/adapters/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,15 @@
zcml:condition="not-have plone-60"
/>

<!-- namechooser adapters -->
<adapter
factory=".namechooser.NormalizingNameChooser"
provides="zope.container.interfaces.INameChooser"
for="plone.dexterity.interfaces.IDexterityContainer"
/>
<adapter
factory=".namechooser.NormalizingNameChooser"
provides="zope.container.interfaces.INameChooser"
for="Products.CMFCore.interfaces.ISiteRoot"
/>
</configure>
41 changes: 41 additions & 0 deletions src/redturtle/volto/adapters/namechooser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from Acquisition import aq_inner
from plone import api
from plone.app.content.namechooser import (
NormalizingNameChooser as BaseNormalizingNameChooser,
)
from plone.app.redirector.interfaces import IRedirectionStorage
from redturtle.volto import _
from redturtle.volto.interfaces import IRedTurtleVoltoSettings
from zExceptions import BadRequest
from zope.component import getUtility


class NormalizingNameChooser(BaseNormalizingNameChooser):
def chooseName(self, name, obj):
"""
Additional check: the id should not be in redirection tool.
"""
id = super().chooseName(name=name, obj=obj)
try:
if not api.portal.get_registry_record(
"check_aliases_in_namechooser",
interface=IRedTurtleVoltoSettings,
default=False,
):
return id
except KeyError:
return id
parent = aq_inner(self.context)
storage = getUtility(IRedirectionStorage)
path = "/".join(parent.getPhysicalPath()) + "/" + id
if storage.get(path):
portal_path = "/".join(api.portal.get().getPhysicalPath())
fixed_path = path.replace(portal_path, "")
msg = _(
"name_chooser_alias_error",
default='The id "${id}" is invalid because there is already an alias for that path. '
'Search "${fixed_path}" in aliases management to manage it.',
mapping={"id": id, "fixed_path": fixed_path},
)
raise BadRequest(api.portal.translate(msg))
return id
13 changes: 13 additions & 0 deletions src/redturtle/volto/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,16 @@ class IRedTurtleVoltoSettings(Interface):
default=False,
required=False,
)

check_aliases_in_namechooser = Bool(
title=_(
"check_aliases_in_namechooser_label",
default="Disallow ids used in aliases",
),
description=_(
"check_aliases_in_namechooser_help",
default="If enabled, users can't create contents with ids that are already used as aliases.",
),
default=False,
required=False,
)
33 changes: 24 additions & 9 deletions src/redturtle/volto/locales/it/LC_MESSAGES/redturtle.volto.po
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2023-03-16 14:54+0000\n"
"POT-Creation-Date: 2024-03-21 13:53+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand All @@ -14,7 +14,7 @@ msgstr ""
"Preferred-Encodings: utf-8 latin1\n"
"Domain: DOMAIN\n"

#: redturtle/volto/configure.zcml:28
#: redturtle/volto/configure.zcml:29
msgid "Installs the redturtle.volto add-on."
msgstr ""

Expand All @@ -27,11 +27,11 @@ msgstr ""
msgid "RedTurtle Volto Settings"
msgstr "Impostazioni RedTurtle Volto"

#: redturtle/volto/configure.zcml:28
#: redturtle/volto/configure.zcml:29
msgid "RedTurtle: Volto"
msgstr ""

#: redturtle/volto/configure.zcml:37
#: redturtle/volto/configure.zcml:38
msgid "RedTurtle: Volto (uninstall)"
msgstr ""

Expand All @@ -43,31 +43,46 @@ msgstr "Seleziona False per mostrare solo gli elementi non omessi dalla navigazi
msgid "Show elements excluded from navigation"
msgstr "Elementi omessi dalla navigazione"

#: redturtle/volto/configure.zcml:37
#: redturtle/volto/configure.zcml:38
msgid "Uninstalls the redturtle.volto add-on."
msgstr ""

#. Default: "If enabled, users can't create contents with ids that are already used as aliases."
#: redturtle/volto/interfaces.py:36
msgid "check_aliases_in_namechooser_help"
msgstr "Se attivato, alla creazione o rinomina di un contenuto, verrà eseguito anche un controllo su eventuali alias presenti (quelli visibili in Gestione URL), ed eventualmente viene impedita la creazione con quell'id."

#. Default: "Disallow ids used in aliases"
#: redturtle/volto/interfaces.py:32
msgid "check_aliases_in_namechooser_label"
msgstr "Controllo degli id anche sugli alias"

#. Default: "If enabled, a custom ranking for SearchableText searches will be used."
#: redturtle/volto/interfaces.py:24
#: redturtle/volto/interfaces.py:23
msgid "enable_advanced_query_ranking_help"
msgstr "Se abilitato, verrà utilizzato un ranking custom per la ricerca testuale."

#. Default: "Enable AdvancedQuery ranking"
#: redturtle/volto/interfaces.py:20
#: redturtle/volto/interfaces.py:19
msgid "enable_advanced_query_ranking_label"
msgstr "Abilita ranking custom con AdvancedQuery"

#. Default: "The id \"${id}\" is invalid because there is already an alias for that path. Search \"${fixed_path}\" in aliases management to manage it."
#: redturtle/volto/adapters/namechooser.py:35
msgid "name_chooser_alias_error"
msgstr "L'id \"${id}\" non è valido perché già utilizzato per un alias. Puoi verificarlo ed eventualmente cancellarlo, cercando \"${fixed_path}\" nella Gestione URL."

#. Default: "Insert an external link directly into the field,or select an internal link clicking on the icon."
#: redturtle/volto/types/adapters.py:25
msgid "remoteUrl_restapi_label"
msgstr "Inserisci un link esterno direttamente nel campo, oppure seleziona un collegamento ad un contenuto del sito cliccando sull'icona accanto."

#. Default: "Volto Parent URL: Content url without \"/api\"."
#: redturtle/volto/adapters/stringinterp.py:31
#: redturtle/volto/adapters/stringinterp.py:35
msgid "stringinterp_volto_parent_url"
msgstr ""

#. Default: "Volto URL: Content url without \"/api\"."
#: redturtle/volto/adapters/stringinterp.py:13
#: redturtle/volto/adapters/stringinterp.py:18
msgid "stringinterp_volto_url"
msgstr "Volto URL: URL del contenuto Plone senza \"/api\"."
33 changes: 24 additions & 9 deletions src/redturtle/volto/locales/redturtle.volto.pot
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2023-03-16 14:54+0000\n"
"POT-Creation-Date: 2024-03-21 13:53+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand All @@ -17,7 +17,7 @@ msgstr ""
"Preferred-Encodings: utf-8 latin1\n"
"Domain: redturtle.volto\n"

#: redturtle/volto/configure.zcml:28
#: redturtle/volto/configure.zcml:29
msgid "Installs the redturtle.volto add-on."
msgstr ""

Expand All @@ -30,11 +30,11 @@ msgstr ""
msgid "RedTurtle Volto Settings"
msgstr ""

#: redturtle/volto/configure.zcml:28
#: redturtle/volto/configure.zcml:29
msgid "RedTurtle: Volto"
msgstr ""

#: redturtle/volto/configure.zcml:37
#: redturtle/volto/configure.zcml:38
msgid "RedTurtle: Volto (uninstall)"
msgstr ""

Expand All @@ -46,31 +46,46 @@ msgstr ""
msgid "Show elements excluded from navigation"
msgstr ""

#: redturtle/volto/configure.zcml:37
#: redturtle/volto/configure.zcml:38
msgid "Uninstalls the redturtle.volto add-on."
msgstr ""

#. Default: "If enabled, users can't create contents with ids that are already used as aliases."
#: redturtle/volto/interfaces.py:36
msgid "check_aliases_in_namechooser_help"
msgstr ""

#. Default: "Disallow ids used in aliases"
#: redturtle/volto/interfaces.py:32
msgid "check_aliases_in_namechooser_label"
msgstr ""

#. Default: "If enabled, a custom ranking for SearchableText searches will be used."
#: redturtle/volto/interfaces.py:24
#: redturtle/volto/interfaces.py:23
msgid "enable_advanced_query_ranking_help"
msgstr ""

#. Default: "Enable AdvancedQuery ranking"
#: redturtle/volto/interfaces.py:20
#: redturtle/volto/interfaces.py:19
msgid "enable_advanced_query_ranking_label"
msgstr ""

#. Default: "The id \"${id}\" is invalid because there is already an alias for that path. Search \"${fixed_path}\" in aliases management to manage it."
#: redturtle/volto/adapters/namechooser.py:35
msgid "name_chooser_alias_error"
msgstr ""

#. Default: "Insert an external link directly into the field,or select an internal link clicking on the icon."
#: redturtle/volto/types/adapters.py:25
msgid "remoteUrl_restapi_label"
msgstr ""

#. Default: "Volto Parent URL: Content url without \"/api\"."
#: redturtle/volto/adapters/stringinterp.py:31
#: redturtle/volto/adapters/stringinterp.py:35
msgid "stringinterp_volto_parent_url"
msgstr ""

#. Default: "Volto URL: Content url without \"/api\"."
#: redturtle/volto/adapters/stringinterp.py:13
#: redturtle/volto/adapters/stringinterp.py:18
msgid "stringinterp_volto_url"
msgstr ""
2 changes: 1 addition & 1 deletion src/redturtle/volto/profiles/default/metadata.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<version>4303</version>
<version>4304</version>
<dependencies>
<dependency>profile-plone.volto:default</dependency>
<dependency>profile-plone.app.caching:with-caching-proxy</dependency>
Expand Down
Loading

0 comments on commit ff608ee

Please sign in to comment.