cone.app 2.0.0__tar.gz → 2.2.0__tar.gz
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.
- {cone_app-2.0.0 → cone_app-2.2.0}/.gitignore +0 -2
- {cone_app-2.0.0 → cone_app-2.2.0}/CHANGES.rst +147 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/PKG-INFO +153 -5
- cone_app-2.2.0/biome.json +31 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/include.mk +17 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/pyproject.toml +17 -6
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/__init__.py +60 -29
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/actions.py +3 -7
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/ajax.py +11 -6
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/authoring.py +11 -15
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/contextmenu.py +3 -5
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/copysupport.py +1 -2
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/exception.py +17 -12
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/form.py +2 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/login.py +19 -5
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/referencebrowser.py +4 -6
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.js +875 -871
- cone_app-2.2.0/src/cone/app/browser/static/cone/cone.app.min.js +1 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/utils.py +37 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/workflow.py +6 -5
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/locale/cone.app.pot +5 -0
- cone_app-2.2.0/src/cone/app/locale/de/LC_MESSAGES/cone.app.mo +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/locale/de/LC_MESSAGES/cone.app.po +5 -0
- cone_app-2.2.0/src/cone/app/locale/en/LC_MESSAGES/cone.app.mo +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/locale/en/LC_MESSAGES/cone.app.po +5 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/model.py +5 -7
- cone_app-2.2.0/src/cone/app/origin.py +66 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/security.py +73 -10
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/__init__.py +11 -1
- cone_app-2.2.0/src/cone/app/testing/data/ugm/users +6 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/mock.py +4 -4
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_app.py +78 -25
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser.py +1 -3
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_actions.py +8 -10
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_ajax.py +54 -11
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_authoring.py +38 -20
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_contents.py +5 -5
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_exception.py +73 -67
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_form.py +53 -15
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_layout.py +24 -22
- cone_app-2.2.0/src/cone/app/tests/test_browser_login.py +171 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_referencebrowser.py +76 -60
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_resources.py +3 -9
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_settings.py +15 -23
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_sharing.py +1 -3
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_table.py +1 -3
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_translation.py +1 -3
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_utils.py +39 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_workflow.py +6 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_model.py +9 -13
- cone_app-2.2.0/src/cone/app/tests/test_origin.py +182 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_security.py +129 -12
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_workflow.py +1 -1
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/workflow.py +4 -4
- cone_app-2.0.0/src/cone/app/browser/static/cone/cone.app.min.js +0 -1
- cone_app-2.0.0/src/cone/app/locale/de/LC_MESSAGES/cone.app.mo +0 -0
- cone_app-2.0.0/src/cone/app/locale/en/LC_MESSAGES/cone.app.mo +0 -0
- cone_app-2.0.0/src/cone/app/testing/data/ugm/users +0 -6
- cone_app-2.0.0/src/cone/app/tests/test_browser_login.py +0 -54
- {cone_app-2.0.0 → cone_app-2.2.0}/LICENSE.rst +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/README.rst +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/TODO.rst +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/constraints.txt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/requirements.txt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/__init__.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/batch.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/content.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/contents.py +1 -1
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/layout.py +1 -1
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/order.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/resources.py +1 -1
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/search.py +1 -1
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/settings.py +2 -2
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/sharing.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/css/bootstrap.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/css/bootstrap.min.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.json +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.min.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/bootstrap-icons.scss +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/fonts/bootstrap-icons.woff +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/icons/fonts/bootstrap-icons.woff2 +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/js/bootstrap.bundle.js +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/js/bootstrap.bundle.min.js +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/bootstrap/js/popper.min.js +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.min.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/cone.app.print.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/favicon.ico +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/de.svg +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/en.svg +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/fr.svg +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/cone/flags/it.svg +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/jquery/jquery-4.0.0.js +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/static/jquery/jquery-4.0.0.min.js +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/table.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/action_download.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/action_dropdown.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/add_dropdown.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batch.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batched_items.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batched_items_footer.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/batched_items_header.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/button_action.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/byline.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/colortoggler.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/content_form.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/contextmenu.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/contextmenu_dropdown.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/default_root.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/footer.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/insufficient_privileges.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/language.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/layout.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/link_action.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/listing.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/livesearch.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/logo.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/main.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/mainmenu.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/navtree.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/navtree_recue.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/not_found.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/pathbar.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/personaltools.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/referencebrowser.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/referencebrowser_pathbar.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/resources.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/settings.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/settings_form.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/settings_sidebar.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/sharing.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/table.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/unauthorized.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/templates/wf_dropdown.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/browser/translation.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/compat.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/configure.zcml +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/interfaces.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/groups +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/roles +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/groups/group1 +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/admin +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/editor +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/manager +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/max +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/sepp +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/data/ugm/userdata/users/viewer +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_action.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_batched_items.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_form.yaml +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_main.pt +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/dummy_workflow.zcml +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/print1.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/print2.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/script1.js +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/script2.js +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/style1.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/testing/static/style2.css +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_batch.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_content.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_contextmenu.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_copysupport.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_order.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_browser_search.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_testing.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_ugm.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/tests/test_utils.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/ugm.py +0 -0
- {cone_app-2.0.0 → cone_app-2.2.0}/src/cone/app/utils.py +0 -0
|
@@ -1,6 +1,153 @@
|
|
|
1
1
|
Changes
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
+
2.2.0 (2026-11-09)
|
|
5
|
+
------------------
|
|
6
|
+
|
|
7
|
+
- The ``ajaxaction`` view only accepts ``POST`` requests. Requires ``treibstoff``
|
|
8
|
+
2.1.0.
|
|
9
|
+
[rnix]
|
|
10
|
+
|
|
11
|
+
- The tile ``wf_dropdown`` only performs ``do_transition`` on ``POST`` requests.
|
|
12
|
+
[rnix]
|
|
13
|
+
|
|
14
|
+
- ``Form`` only runs form actions on ``POST`` requests. On any other request it
|
|
15
|
+
renders the form. Tests calling a form action need ``request.method = 'POST'``.
|
|
16
|
+
[rnix]
|
|
17
|
+
|
|
18
|
+
- Answer requests other than ``GET``, ``HEAD`` and ``OPTIONS`` with status ``403``
|
|
19
|
+
if a browser sends them for another site, recognized by the ``Sec-Fetch-Site``
|
|
20
|
+
and ``Origin`` headers. Clients sending neither pass. Add
|
|
21
|
+
``cone.trusted_origins`` for browser clients of other origins.
|
|
22
|
+
[rnix]
|
|
23
|
+
|
|
24
|
+
- Encode the node title in reference actions and in the link to leaf nodes, and
|
|
25
|
+
the label in display mode of the ``reference`` blueprint. Requires ``yafowil``
|
|
26
|
+
4.2.0.
|
|
27
|
+
[rnix]
|
|
28
|
+
|
|
29
|
+
- ``main`` refuses to start if ``cone.auth_secret`` is missing or has the former
|
|
30
|
+
default value ``secret``.
|
|
31
|
+
[rnix]
|
|
32
|
+
|
|
33
|
+
- Read ``cone.auth_secure``, ``cone.auth_include_ip``, ``cone.auth_http_only`` and
|
|
34
|
+
``cone.auth_wild_domain`` as booleans. ``false`` in an ini file was considered
|
|
35
|
+
true before, applications with such a value change their behavior.
|
|
36
|
+
[rnix]
|
|
37
|
+
|
|
38
|
+
- ``cone.auth_http_only`` defaults to ``True``.
|
|
39
|
+
[rnix]
|
|
40
|
+
|
|
41
|
+
- Failures in ajax actions, ajax forms and the exception view answer with a
|
|
42
|
+
general message, the traceback goes to the log. Add setting
|
|
43
|
+
``cone.show_tracebacks`` to show it to the client during development. Add
|
|
44
|
+
``browser.utils.client_error_message``.
|
|
45
|
+
[rnix]
|
|
46
|
+
|
|
47
|
+
- ``internal_server_error`` answers with status 500 instead of 200, also for
|
|
48
|
+
ajax requests. A ``default_commit_veto`` configured for ``pyramid_tm`` vetoes
|
|
49
|
+
such a request now, before it committed.
|
|
50
|
+
[rnix]
|
|
51
|
+
|
|
52
|
+
- Compare the credentials of the admin user with ``hmac.compare_digest``.
|
|
53
|
+
[rnix]
|
|
54
|
+
|
|
55
|
+
- A failed login in the login form answers with status 401 instead of 200, so a
|
|
56
|
+
throttle at the edge can recognize it. All failed logins log a warning with the
|
|
57
|
+
first two characters of the login name and the client address. The login form only
|
|
58
|
+
checks the password in the ``login`` view, not on other pages showing the form or
|
|
59
|
+
through ``ajaxaction``.
|
|
60
|
+
[rnix]
|
|
61
|
+
|
|
62
|
+
- ``logout_view`` follows ``came_from`` only to an HTTP URL on the host of the
|
|
63
|
+
application. ``CameFromNext`` considers the scheme too. Add
|
|
64
|
+
``browser.utils.is_same_host_url``.
|
|
65
|
+
[rnix]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
2.1.0 (2026-10-31)
|
|
69
|
+
------------------
|
|
70
|
+
|
|
71
|
+
- Require ``cone.tile>2.0.99``. ``cone.tile`` 2.0 secures tiles only if an
|
|
72
|
+
authentication and an authorization policy are registered, so it does not
|
|
73
|
+
protect tiles with the security policy configured by ``cone.app.main``.
|
|
74
|
+
[rnix]
|
|
75
|
+
|
|
76
|
+
- Remove ``MainMenu.on_sidebar_left_resize``, which rendered the main menu
|
|
77
|
+
scrollbar again on each left sidebar resize. Both sidebars live inside the
|
|
78
|
+
content area below the header, so resizing them does not change the width of
|
|
79
|
+
the main menu. ``MainMenu`` keeps the inherited ``LayoutAware`` behavior.
|
|
80
|
+
[rnix]
|
|
81
|
+
|
|
82
|
+
- Fix shift click selection of ``Selectable`` items. Shift click selects the
|
|
83
|
+
range from the last plain or ctrl clicked item (the anchor) to the clicked
|
|
84
|
+
item, as in file managers. Before, a further shift click started the range at
|
|
85
|
+
the wrong item. Shift click without an anchor acts like a plain click.
|
|
86
|
+
``Selectable.select_direction`` and ``Selectable.get_nearest`` are removed.
|
|
87
|
+
[rnix]
|
|
88
|
+
|
|
89
|
+
- Fix ``SidebarLeft`` and ``SidebarRight`` skipping their initialization on
|
|
90
|
+
small viewports with a stored lock state. The sidebar content and the ajax
|
|
91
|
+
destroy hook were missing.
|
|
92
|
+
[rnix]
|
|
93
|
+
|
|
94
|
+
- Fix ``LayoutAware`` handling a right sidebar resize as a left sidebar resize.
|
|
95
|
+
``is_sidebar_left_collapsed`` and ``is_sidebar_right_collapsed`` are
|
|
96
|
+
properties now, so ``on_is_sidebar_left_collapsed`` and
|
|
97
|
+
``on_is_sidebar_right_collapsed`` get called on changes. The unused
|
|
98
|
+
``is_sidebar_collapsed`` property is removed.
|
|
99
|
+
[rnix]
|
|
100
|
+
|
|
101
|
+
- Fix the color mode toggle not following changes of the OS color scheme.
|
|
102
|
+
A destroyed ``ColorToggler`` stops following them and no longer keeps the
|
|
103
|
+
removed toggle in memory. Fix ``ColorMode.unbind`` not removing its
|
|
104
|
+
listener. ``ColorMode.media_query`` returns the same ``MediaQueryList`` on
|
|
105
|
+
each call now, the new ``ColorMode.unwatch`` removes a listener added with
|
|
106
|
+
``ColorMode.watch``.
|
|
107
|
+
[rnix]
|
|
108
|
+
|
|
109
|
+
- Fix ``Header`` binding the mobile menu collapse handlers again on each switch
|
|
110
|
+
to compact mode, and keeping them after leaving compact mode or destroying
|
|
111
|
+
the header, which caused a ``TypeError`` on later collapse events.
|
|
112
|
+
[rnix]
|
|
113
|
+
|
|
114
|
+
- Extend the JS tests to 100 % coverage, all modules including bundles are
|
|
115
|
+
loaded by the tests now.
|
|
116
|
+
[rnix]
|
|
117
|
+
|
|
118
|
+
- Lint and format the JS code with biome. ``make check`` runs ``biome check``,
|
|
119
|
+
``make format`` runs ``biome check --write`` (see ``include.mk``). Behavior
|
|
120
|
+
unchanged.
|
|
121
|
+
[rnix]
|
|
122
|
+
|
|
123
|
+
- JS tooling: Commit ``pnpm-lock.yaml``. Upgrade ``@web/test-runner`` to 1.0
|
|
124
|
+
and run the JS tests headless in Chromium via Playwright, installed in the JS
|
|
125
|
+
CI workflow. Drop the accidental ``install`` dev dependency. Pin patched
|
|
126
|
+
versions of vulnerable transitive dependencies via ``pnpm.overrides``.
|
|
127
|
+
[rnix]
|
|
128
|
+
|
|
129
|
+
- Use a Pyramid security policy instead of the authentication and
|
|
130
|
+
authorization policies deprecated in Pyramid 2.0. ``cone.app.main``
|
|
131
|
+
configures ``cone.app.security.SecurityPolicy`` (auth ticket cookie and
|
|
132
|
+
ACLs, principals from ``groups_callback``) unless a security policy is
|
|
133
|
+
registered already. The ``cone.auth_*`` settings keep working.
|
|
134
|
+
``cone.app.auth_tkt_factory`` and ``cone.app.acl_factory`` are deprecated.
|
|
135
|
+
[rnix]
|
|
136
|
+
|
|
137
|
+
- Import ``Allow``, ``Deny``, ``Everyone`` and ``ALL_PERMISSIONS`` from
|
|
138
|
+
``pyramid.authorization``, they are deprecated in ``pyramid.security``.
|
|
139
|
+
[rnix]
|
|
140
|
+
|
|
141
|
+
- Sort the imports with ruff (one per line, ``from`` imports first, no
|
|
142
|
+
sections) and format the code with ``ruff format`` (90 characters per line,
|
|
143
|
+
single quotes).
|
|
144
|
+
[rnix]
|
|
145
|
+
|
|
146
|
+
- Add import sorting (``I`` rules) and the formatter settings to the ruff
|
|
147
|
+
configuration in ``pyproject.toml``.
|
|
148
|
+
[rnix]
|
|
149
|
+
|
|
150
|
+
|
|
4
151
|
2.0.0 (2026-10-24)
|
|
5
152
|
------------------
|
|
6
153
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: cone.app
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Web application stub
|
|
5
5
|
Project-URL: Homepage, http://github.com/conestack/cone.app
|
|
6
6
|
Author-email: Cone Contributors <dev@conestack.org>
|
|
@@ -14,21 +14,22 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.14
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
17
18
|
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
18
19
|
Requires-Python: >=3.10
|
|
19
20
|
Requires-Dist: chameleon
|
|
20
|
-
Requires-Dist: cone-tile>1.99
|
|
21
|
-
Requires-Dist: node-ext-ugm>
|
|
21
|
+
Requires-Dist: cone-tile>2.1.99
|
|
22
|
+
Requires-Dist: node-ext-ugm>2.0.99
|
|
22
23
|
Requires-Dist: node>1.99
|
|
23
24
|
Requires-Dist: pyramid-chameleon
|
|
24
25
|
Requires-Dist: pyramid-zcml
|
|
25
26
|
Requires-Dist: pyramid>=2.0
|
|
26
27
|
Requires-Dist: repoze-workflow
|
|
27
|
-
Requires-Dist: treibstoff>
|
|
28
|
+
Requires-Dist: treibstoff>2.0.99
|
|
28
29
|
Requires-Dist: webresource>1.2.99
|
|
29
30
|
Requires-Dist: yafowil-bootstrap>1.99
|
|
30
31
|
Requires-Dist: yafowil-webob>1.99
|
|
31
|
-
Requires-Dist: yafowil>
|
|
32
|
+
Requires-Dist: yafowil>4.1.99
|
|
32
33
|
Provides-Extra: docs
|
|
33
34
|
Requires-Dist: repoze-sphinx-autointerface; extra == 'docs'
|
|
34
35
|
Requires-Dist: sphinx; extra == 'docs'
|
|
@@ -103,6 +104,153 @@ Contributors
|
|
|
103
104
|
Changes
|
|
104
105
|
=======
|
|
105
106
|
|
|
107
|
+
2.2.0 (2026-11-09)
|
|
108
|
+
------------------
|
|
109
|
+
|
|
110
|
+
- The ``ajaxaction`` view only accepts ``POST`` requests. Requires ``treibstoff``
|
|
111
|
+
2.1.0.
|
|
112
|
+
[rnix]
|
|
113
|
+
|
|
114
|
+
- The tile ``wf_dropdown`` only performs ``do_transition`` on ``POST`` requests.
|
|
115
|
+
[rnix]
|
|
116
|
+
|
|
117
|
+
- ``Form`` only runs form actions on ``POST`` requests. On any other request it
|
|
118
|
+
renders the form. Tests calling a form action need ``request.method = 'POST'``.
|
|
119
|
+
[rnix]
|
|
120
|
+
|
|
121
|
+
- Answer requests other than ``GET``, ``HEAD`` and ``OPTIONS`` with status ``403``
|
|
122
|
+
if a browser sends them for another site, recognized by the ``Sec-Fetch-Site``
|
|
123
|
+
and ``Origin`` headers. Clients sending neither pass. Add
|
|
124
|
+
``cone.trusted_origins`` for browser clients of other origins.
|
|
125
|
+
[rnix]
|
|
126
|
+
|
|
127
|
+
- Encode the node title in reference actions and in the link to leaf nodes, and
|
|
128
|
+
the label in display mode of the ``reference`` blueprint. Requires ``yafowil``
|
|
129
|
+
4.2.0.
|
|
130
|
+
[rnix]
|
|
131
|
+
|
|
132
|
+
- ``main`` refuses to start if ``cone.auth_secret`` is missing or has the former
|
|
133
|
+
default value ``secret``.
|
|
134
|
+
[rnix]
|
|
135
|
+
|
|
136
|
+
- Read ``cone.auth_secure``, ``cone.auth_include_ip``, ``cone.auth_http_only`` and
|
|
137
|
+
``cone.auth_wild_domain`` as booleans. ``false`` in an ini file was considered
|
|
138
|
+
true before, applications with such a value change their behavior.
|
|
139
|
+
[rnix]
|
|
140
|
+
|
|
141
|
+
- ``cone.auth_http_only`` defaults to ``True``.
|
|
142
|
+
[rnix]
|
|
143
|
+
|
|
144
|
+
- Failures in ajax actions, ajax forms and the exception view answer with a
|
|
145
|
+
general message, the traceback goes to the log. Add setting
|
|
146
|
+
``cone.show_tracebacks`` to show it to the client during development. Add
|
|
147
|
+
``browser.utils.client_error_message``.
|
|
148
|
+
[rnix]
|
|
149
|
+
|
|
150
|
+
- ``internal_server_error`` answers with status 500 instead of 200, also for
|
|
151
|
+
ajax requests. A ``default_commit_veto`` configured for ``pyramid_tm`` vetoes
|
|
152
|
+
such a request now, before it committed.
|
|
153
|
+
[rnix]
|
|
154
|
+
|
|
155
|
+
- Compare the credentials of the admin user with ``hmac.compare_digest``.
|
|
156
|
+
[rnix]
|
|
157
|
+
|
|
158
|
+
- A failed login in the login form answers with status 401 instead of 200, so a
|
|
159
|
+
throttle at the edge can recognize it. All failed logins log a warning with the
|
|
160
|
+
first two characters of the login name and the client address. The login form only
|
|
161
|
+
checks the password in the ``login`` view, not on other pages showing the form or
|
|
162
|
+
through ``ajaxaction``.
|
|
163
|
+
[rnix]
|
|
164
|
+
|
|
165
|
+
- ``logout_view`` follows ``came_from`` only to an HTTP URL on the host of the
|
|
166
|
+
application. ``CameFromNext`` considers the scheme too. Add
|
|
167
|
+
``browser.utils.is_same_host_url``.
|
|
168
|
+
[rnix]
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
2.1.0 (2026-10-31)
|
|
172
|
+
------------------
|
|
173
|
+
|
|
174
|
+
- Require ``cone.tile>2.0.99``. ``cone.tile`` 2.0 secures tiles only if an
|
|
175
|
+
authentication and an authorization policy are registered, so it does not
|
|
176
|
+
protect tiles with the security policy configured by ``cone.app.main``.
|
|
177
|
+
[rnix]
|
|
178
|
+
|
|
179
|
+
- Remove ``MainMenu.on_sidebar_left_resize``, which rendered the main menu
|
|
180
|
+
scrollbar again on each left sidebar resize. Both sidebars live inside the
|
|
181
|
+
content area below the header, so resizing them does not change the width of
|
|
182
|
+
the main menu. ``MainMenu`` keeps the inherited ``LayoutAware`` behavior.
|
|
183
|
+
[rnix]
|
|
184
|
+
|
|
185
|
+
- Fix shift click selection of ``Selectable`` items. Shift click selects the
|
|
186
|
+
range from the last plain or ctrl clicked item (the anchor) to the clicked
|
|
187
|
+
item, as in file managers. Before, a further shift click started the range at
|
|
188
|
+
the wrong item. Shift click without an anchor acts like a plain click.
|
|
189
|
+
``Selectable.select_direction`` and ``Selectable.get_nearest`` are removed.
|
|
190
|
+
[rnix]
|
|
191
|
+
|
|
192
|
+
- Fix ``SidebarLeft`` and ``SidebarRight`` skipping their initialization on
|
|
193
|
+
small viewports with a stored lock state. The sidebar content and the ajax
|
|
194
|
+
destroy hook were missing.
|
|
195
|
+
[rnix]
|
|
196
|
+
|
|
197
|
+
- Fix ``LayoutAware`` handling a right sidebar resize as a left sidebar resize.
|
|
198
|
+
``is_sidebar_left_collapsed`` and ``is_sidebar_right_collapsed`` are
|
|
199
|
+
properties now, so ``on_is_sidebar_left_collapsed`` and
|
|
200
|
+
``on_is_sidebar_right_collapsed`` get called on changes. The unused
|
|
201
|
+
``is_sidebar_collapsed`` property is removed.
|
|
202
|
+
[rnix]
|
|
203
|
+
|
|
204
|
+
- Fix the color mode toggle not following changes of the OS color scheme.
|
|
205
|
+
A destroyed ``ColorToggler`` stops following them and no longer keeps the
|
|
206
|
+
removed toggle in memory. Fix ``ColorMode.unbind`` not removing its
|
|
207
|
+
listener. ``ColorMode.media_query`` returns the same ``MediaQueryList`` on
|
|
208
|
+
each call now, the new ``ColorMode.unwatch`` removes a listener added with
|
|
209
|
+
``ColorMode.watch``.
|
|
210
|
+
[rnix]
|
|
211
|
+
|
|
212
|
+
- Fix ``Header`` binding the mobile menu collapse handlers again on each switch
|
|
213
|
+
to compact mode, and keeping them after leaving compact mode or destroying
|
|
214
|
+
the header, which caused a ``TypeError`` on later collapse events.
|
|
215
|
+
[rnix]
|
|
216
|
+
|
|
217
|
+
- Extend the JS tests to 100 % coverage, all modules including bundles are
|
|
218
|
+
loaded by the tests now.
|
|
219
|
+
[rnix]
|
|
220
|
+
|
|
221
|
+
- Lint and format the JS code with biome. ``make check`` runs ``biome check``,
|
|
222
|
+
``make format`` runs ``biome check --write`` (see ``include.mk``). Behavior
|
|
223
|
+
unchanged.
|
|
224
|
+
[rnix]
|
|
225
|
+
|
|
226
|
+
- JS tooling: Commit ``pnpm-lock.yaml``. Upgrade ``@web/test-runner`` to 1.0
|
|
227
|
+
and run the JS tests headless in Chromium via Playwright, installed in the JS
|
|
228
|
+
CI workflow. Drop the accidental ``install`` dev dependency. Pin patched
|
|
229
|
+
versions of vulnerable transitive dependencies via ``pnpm.overrides``.
|
|
230
|
+
[rnix]
|
|
231
|
+
|
|
232
|
+
- Use a Pyramid security policy instead of the authentication and
|
|
233
|
+
authorization policies deprecated in Pyramid 2.0. ``cone.app.main``
|
|
234
|
+
configures ``cone.app.security.SecurityPolicy`` (auth ticket cookie and
|
|
235
|
+
ACLs, principals from ``groups_callback``) unless a security policy is
|
|
236
|
+
registered already. The ``cone.auth_*`` settings keep working.
|
|
237
|
+
``cone.app.auth_tkt_factory`` and ``cone.app.acl_factory`` are deprecated.
|
|
238
|
+
[rnix]
|
|
239
|
+
|
|
240
|
+
- Import ``Allow``, ``Deny``, ``Everyone`` and ``ALL_PERMISSIONS`` from
|
|
241
|
+
``pyramid.authorization``, they are deprecated in ``pyramid.security``.
|
|
242
|
+
[rnix]
|
|
243
|
+
|
|
244
|
+
- Sort the imports with ruff (one per line, ``from`` imports first, no
|
|
245
|
+
sections) and format the code with ``ruff format`` (90 characters per line,
|
|
246
|
+
single quotes).
|
|
247
|
+
[rnix]
|
|
248
|
+
|
|
249
|
+
- Add import sorting (``I`` rules) and the formatter settings to the ruff
|
|
250
|
+
configuration in ``pyproject.toml``.
|
|
251
|
+
[rnix]
|
|
252
|
+
|
|
253
|
+
|
|
106
254
|
2.0.0 (2026-10-24)
|
|
107
255
|
------------------
|
|
108
256
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.6.3/schema.json",
|
|
3
|
+
"files": {
|
|
4
|
+
"includes": ["js/src/**/*.js", "js/tests/**/*.js"]
|
|
5
|
+
},
|
|
6
|
+
"formatter": {
|
|
7
|
+
"enabled": true,
|
|
8
|
+
"indentStyle": "space",
|
|
9
|
+
"indentWidth": 4,
|
|
10
|
+
"lineWidth": 100
|
|
11
|
+
},
|
|
12
|
+
"linter": {
|
|
13
|
+
"enabled": true,
|
|
14
|
+
"rules": {
|
|
15
|
+
"preset": "recommended",
|
|
16
|
+
"correctness": {
|
|
17
|
+
"noUnusedVariables": "warn"
|
|
18
|
+
},
|
|
19
|
+
"complexity": {
|
|
20
|
+
"noStaticOnlyClass": "off",
|
|
21
|
+
"noThisInStatic": "off"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"javascript": {
|
|
26
|
+
"formatter": {
|
|
27
|
+
"quoteStyle": "single",
|
|
28
|
+
"semicolons": "always"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -46,3 +46,20 @@ example-lingua: $(LINGUA_TARGET)
|
|
|
46
46
|
LINGUA_SEARCH_PATH=$(EXAMPLE_LINGUA_SEARCH_PATH) \
|
|
47
47
|
LINGUA_OPTIONS=$(EXAMPLE_LINGUA_OPTIONS) \
|
|
48
48
|
lingua
|
|
49
|
+
|
|
50
|
+
##############################################################################
|
|
51
|
+
# biome (JS linting and formatting)
|
|
52
|
+
##############################################################################
|
|
53
|
+
|
|
54
|
+
.PHONY: biome-check
|
|
55
|
+
biome-check: $(NODEJS_TARGET)
|
|
56
|
+
@echo "Run biome check"
|
|
57
|
+
@biome check
|
|
58
|
+
|
|
59
|
+
.PHONY: biome-format
|
|
60
|
+
biome-format: $(NODEJS_TARGET)
|
|
61
|
+
@echo "Run biome format"
|
|
62
|
+
@biome check --write
|
|
63
|
+
|
|
64
|
+
CHECK_TARGETS+=biome-check
|
|
65
|
+
FORMAT_TARGETS+=biome-format
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cone.app"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.2.0"
|
|
8
8
|
description = "Web application stub"
|
|
9
9
|
dynamic = ["readme"]
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -19,22 +19,23 @@ classifiers = [
|
|
|
19
19
|
"Programming Language :: Python :: 3.12",
|
|
20
20
|
"Programming Language :: Python :: 3.13",
|
|
21
21
|
"Programming Language :: Python :: 3.14",
|
|
22
|
+
"Programming Language :: Python :: 3.15",
|
|
22
23
|
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
|
|
23
24
|
]
|
|
24
25
|
dependencies = [
|
|
25
26
|
"Chameleon",
|
|
26
|
-
"cone.tile>1.99",
|
|
27
|
-
"node.ext.ugm>
|
|
27
|
+
"cone.tile>2.1.99",
|
|
28
|
+
"node.ext.ugm>2.0.99",
|
|
28
29
|
"node>1.99",
|
|
29
30
|
"pyramid>=2.0",
|
|
30
31
|
"pyramid_chameleon",
|
|
31
32
|
"pyramid_zcml",
|
|
32
33
|
"repoze.workflow",
|
|
33
|
-
"treibstoff>
|
|
34
|
+
"treibstoff>2.0.99",
|
|
34
35
|
"webresource>1.2.99",
|
|
35
36
|
"yafowil.bootstrap>1.99",
|
|
36
37
|
"yafowil.webob>1.99",
|
|
37
|
-
"yafowil>
|
|
38
|
+
"yafowil>4.1.99",
|
|
38
39
|
]
|
|
39
40
|
|
|
40
41
|
[project.optional-dependencies]
|
|
@@ -102,12 +103,22 @@ consider_namespace_packages = true
|
|
|
102
103
|
addopts = ["--import-mode=importlib"]
|
|
103
104
|
pythonpath = "src"
|
|
104
105
|
|
|
106
|
+
[tool.ruff]
|
|
107
|
+
line-length = 90
|
|
108
|
+
|
|
105
109
|
[tool.ruff.lint]
|
|
106
|
-
select = ["E4", "E7", "E9", "F", "UP"]
|
|
110
|
+
select = ["E4", "E7", "E9", "F", "I", "UP"]
|
|
107
111
|
# UP008: zero-argument ``super()`` breaks on ``@plumbing`` decorated classes.
|
|
108
112
|
# UP031: ``%`` formatting is kept.
|
|
109
113
|
ignore = ["UP008", "UP031"]
|
|
110
114
|
|
|
115
|
+
[tool.ruff.lint.isort]
|
|
116
|
+
force-single-line = true
|
|
117
|
+
from-first = true
|
|
118
|
+
no-sections = true
|
|
119
|
+
lines-after-imports = 2
|
|
120
|
+
order-by-type = false
|
|
121
|
+
|
|
111
122
|
[tool.ruff.format]
|
|
112
123
|
quote-style = "single"
|
|
113
124
|
|
|
@@ -15,7 +15,9 @@ from pyramid.authentication import AuthTktAuthenticationPolicy
|
|
|
15
15
|
from pyramid.authorization import ACLAuthorizationPolicy
|
|
16
16
|
from pyramid.config import Configurator
|
|
17
17
|
from pyramid.interfaces import ISecurityPolicy
|
|
18
|
+
from pyramid.settings import asbool
|
|
18
19
|
from pyramid.traversal import ResourceTreeTraverser
|
|
20
|
+
from pyramid.tweens import INGRESS
|
|
19
21
|
from yafowil.bootstrap import configure_factory
|
|
20
22
|
from zope.component import adapter
|
|
21
23
|
from zope.component import getGlobalSiteManager
|
|
@@ -25,6 +27,7 @@ import os
|
|
|
25
27
|
import pyramid_chameleon
|
|
26
28
|
import pyramid_zcml
|
|
27
29
|
import threading
|
|
30
|
+
import warnings
|
|
28
31
|
|
|
29
32
|
|
|
30
33
|
logger = logging.getLogger('cone.app')
|
|
@@ -32,6 +35,9 @@ logger = logging.getLogger('cone.app')
|
|
|
32
35
|
# configuration
|
|
33
36
|
cfg = Properties()
|
|
34
37
|
|
|
38
|
+
# show tracebacks to clients
|
|
39
|
+
cfg.show_tracebacks = False
|
|
40
|
+
|
|
35
41
|
# available languages
|
|
36
42
|
cfg.available_languages = []
|
|
37
43
|
|
|
@@ -169,12 +175,24 @@ def thread_shutdown_hook(func): # pragma: no cover
|
|
|
169
175
|
return func
|
|
170
176
|
|
|
171
177
|
|
|
178
|
+
# B/C
|
|
172
179
|
def auth_tkt_factory(**kwargs):
|
|
180
|
+
warnings.warn(
|
|
181
|
+
'``cone.app.auth_tkt_factory`` is deprecated, ``cone.app.main`` '
|
|
182
|
+
'configures ``cone.app.security.SecurityPolicy``',
|
|
183
|
+
DeprecationWarning,
|
|
184
|
+
)
|
|
173
185
|
kwargs.setdefault('callback', security.groups_callback)
|
|
174
186
|
return AuthTktAuthenticationPolicy(**kwargs)
|
|
175
187
|
|
|
176
188
|
|
|
189
|
+
# B/C
|
|
177
190
|
def acl_factory(**kwargs):
|
|
191
|
+
warnings.warn(
|
|
192
|
+
'``cone.app.acl_factory`` is deprecated, ``cone.app.main`` '
|
|
193
|
+
'configures ``cone.app.security.SecurityPolicy``',
|
|
194
|
+
DeprecationWarning,
|
|
195
|
+
)
|
|
178
196
|
return ACLAuthorizationPolicy()
|
|
179
197
|
|
|
180
198
|
|
|
@@ -210,6 +228,41 @@ def start_thread_monitor(): # pragma: no cover
|
|
|
210
228
|
monitor.start()
|
|
211
229
|
|
|
212
230
|
|
|
231
|
+
def create_security_policy(settings):
|
|
232
|
+
"""Create the security policy from application settings.
|
|
233
|
+
|
|
234
|
+
The settings used for this get removed from ``settings``.
|
|
235
|
+
|
|
236
|
+
:param settings: The application settings.
|
|
237
|
+
:return: The security policy.
|
|
238
|
+
:raises ValueError: If ``cone.auth_secret`` is missing or the former default.
|
|
239
|
+
"""
|
|
240
|
+
auth_secret = settings.pop('cone.auth_secret', None)
|
|
241
|
+
if not auth_secret or auth_secret == 'secret':
|
|
242
|
+
raise ValueError(
|
|
243
|
+
'cone.auth_secret signs the authentication cookie and must be set to a '
|
|
244
|
+
'secret value of your own.'
|
|
245
|
+
)
|
|
246
|
+
auth_reissue_time = settings.pop('cone.auth_reissue_time', None)
|
|
247
|
+
if auth_reissue_time is not None:
|
|
248
|
+
auth_reissue_time = int(auth_reissue_time)
|
|
249
|
+
auth_max_age = settings.pop('cone.auth_max_age', None)
|
|
250
|
+
if auth_max_age is not None:
|
|
251
|
+
auth_max_age = int(auth_max_age)
|
|
252
|
+
return security.SecurityPolicy(
|
|
253
|
+
secret=auth_secret,
|
|
254
|
+
cookie_name=settings.pop('cone.auth_cookie_name', 'auth_tkt'),
|
|
255
|
+
secure=asbool(settings.pop('cone.auth_secure', False)),
|
|
256
|
+
include_ip=asbool(settings.pop('cone.auth_include_ip', False)),
|
|
257
|
+
timeout=settings.pop('cone.auth_timeout', None),
|
|
258
|
+
reissue_time=auth_reissue_time,
|
|
259
|
+
max_age=auth_max_age,
|
|
260
|
+
http_only=asbool(settings.pop('cone.auth_http_only', True)),
|
|
261
|
+
path=settings.pop('cone.auth_path', '/'),
|
|
262
|
+
wild_domain=asbool(settings.pop('cone.auth_wild_domain', True)),
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
213
266
|
def main(global_config, **settings):
|
|
214
267
|
"""Returns WSGI application."""
|
|
215
268
|
# set authentication related application properties
|
|
@@ -222,33 +275,9 @@ def main(global_config, **settings):
|
|
|
222
275
|
if node_available_callback:
|
|
223
276
|
security.node_available = import_from_string(node_available_callback)
|
|
224
277
|
|
|
225
|
-
|
|
226
|
-
auth_cookie_name = settings.pop('cone.auth_cookie_name', 'auth_tkt')
|
|
227
|
-
auth_secure = settings.pop('cone.auth_secure', False)
|
|
228
|
-
auth_include_ip = settings.pop('cone.auth_include_ip', False)
|
|
229
|
-
auth_timeout = settings.pop('cone.auth_timeout', None)
|
|
230
|
-
auth_reissue_time = settings.pop('cone.auth_reissue_time', None)
|
|
231
|
-
if auth_reissue_time is not None:
|
|
232
|
-
auth_reissue_time = int(auth_reissue_time)
|
|
233
|
-
auth_max_age = settings.pop('cone.auth_max_age', None)
|
|
234
|
-
if auth_max_age is not None:
|
|
235
|
-
auth_max_age = int(auth_max_age)
|
|
236
|
-
auth_http_only = settings.pop('cone.auth_http_only', False)
|
|
237
|
-
auth_path = settings.pop('cone.auth_path', '/')
|
|
238
|
-
auth_wild_domain = settings.pop('cone.auth_wild_domain', True)
|
|
278
|
+
security_policy = create_security_policy(settings)
|
|
239
279
|
|
|
240
|
-
|
|
241
|
-
secret=auth_secret,
|
|
242
|
-
cookie_name=auth_cookie_name,
|
|
243
|
-
secure=auth_secure,
|
|
244
|
-
include_ip=auth_include_ip,
|
|
245
|
-
timeout=auth_timeout,
|
|
246
|
-
reissue_time=auth_reissue_time,
|
|
247
|
-
max_age=auth_max_age,
|
|
248
|
-
http_only=auth_http_only,
|
|
249
|
-
path=auth_path,
|
|
250
|
-
wild_domain=auth_wild_domain,
|
|
251
|
-
)
|
|
280
|
+
cfg.show_tracebacks = asbool(settings.pop('cone.show_tracebacks', False))
|
|
252
281
|
|
|
253
282
|
# create root node
|
|
254
283
|
global root
|
|
@@ -268,10 +297,9 @@ def main(global_config, **settings):
|
|
|
268
297
|
# Initialize resource registry
|
|
269
298
|
ResourceRegistry.initialize(config, settings)
|
|
270
299
|
|
|
271
|
-
# set
|
|
300
|
+
# set security policy
|
|
272
301
|
if config.registry.queryUtility(ISecurityPolicy) is None:
|
|
273
|
-
config.
|
|
274
|
-
config.set_authorization_policy(acl_factory())
|
|
302
|
+
config.set_security_policy(security_policy)
|
|
275
303
|
config.commit()
|
|
276
304
|
|
|
277
305
|
# begin configuration
|
|
@@ -302,6 +330,9 @@ def main(global_config, **settings):
|
|
|
302
330
|
# provide locales either in yafowil resources or as entry points in
|
|
303
331
|
# all yafowil packages providing translations
|
|
304
332
|
|
|
333
|
+
# outermost, a refused request does not reach the transaction or the views
|
|
334
|
+
config.add_tween('cone.app.origin.origin_check_tween_factory', under=INGRESS)
|
|
335
|
+
|
|
305
336
|
# static routes
|
|
306
337
|
config.add_route('favicon', '/favicon.ico')
|
|
307
338
|
# XXX: robots.txt
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import copy
|
|
2
1
|
from cone.app.browser.utils import bdajax_warning
|
|
3
2
|
from cone.app.browser.utils import make_query
|
|
4
3
|
from cone.app.browser.utils import make_url
|
|
@@ -10,6 +9,7 @@ from cone.tile import render_tile
|
|
|
10
9
|
from node.interfaces import IMappingOrder
|
|
11
10
|
from odict import odict
|
|
12
11
|
from pyramid.i18n import TranslationStringFactory
|
|
12
|
+
import copy
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
_ = TranslationStringFactory('cone.app')
|
|
@@ -478,9 +478,7 @@ class ActionDelete(LinkAction):
|
|
|
478
478
|
id = 'toolbaraction-delete'
|
|
479
479
|
icon = 'bi-trash3'
|
|
480
480
|
action = 'delete:NONE:NONE'
|
|
481
|
-
confirm = _(
|
|
482
|
-
'delete_item_confirm', default='Do you really want to delete this Item?'
|
|
483
|
-
)
|
|
481
|
+
confirm = _('delete_item_confirm', default='Do you really want to delete this Item?')
|
|
484
482
|
text = _('action_delete', default='Delete')
|
|
485
483
|
|
|
486
484
|
@property
|
|
@@ -489,9 +487,7 @@ class ActionDelete(LinkAction):
|
|
|
489
487
|
scope = self.action_scope == 'content'
|
|
490
488
|
if self.model.properties.default_content_tile:
|
|
491
489
|
scope = self.action_scope == 'view'
|
|
492
|
-
return (
|
|
493
|
-
self.model.properties.action_delete and self.permitted('delete') and scope
|
|
494
|
-
)
|
|
490
|
+
return self.model.properties.action_delete and self.permitted('delete') and scope
|
|
495
491
|
|
|
496
492
|
|
|
497
493
|
class ActionDeleteChildren(LinkAction):
|