plone.securitytxt 1.0.0b1__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.
Files changed (170) hide show
  1. plone_securitytxt-1.0.0b1/.copier-answers.yml +14 -0
  2. plone_securitytxt-1.0.0b1/.copier-answers.zope-instance-instance.yml +8 -0
  3. plone_securitytxt-1.0.0b1/.copier-answers.zope-setup.yml +10 -0
  4. plone_securitytxt-1.0.0b1/.devshell.json +6 -0
  5. plone_securitytxt-1.0.0b1/.editorconfig +21 -0
  6. plone_securitytxt-1.0.0b1/.github/workflows/ci.yml +73 -0
  7. plone_securitytxt-1.0.0b1/.gitignore +94 -0
  8. plone_securitytxt-1.0.0b1/.pi/remote-pi/config.json +4 -0
  9. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/30886047_reviewer_0_input.md +60 -0
  10. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/30886047_reviewer_0_meta.json +154 -0
  11. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/30886047_reviewer_0_output.md +5 -0
  12. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/30886047_reviewer_0_transcript.jsonl +99 -0
  13. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/4a07104b_reviewer_0_input.md +61 -0
  14. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/4a07104b_reviewer_0_meta.json +165 -0
  15. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/4a07104b_reviewer_0_output.md +7 -0
  16. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/4a07104b_reviewer_0_transcript.jsonl +179 -0
  17. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/50004a9d_reviewer_0_input.md +56 -0
  18. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/50004a9d_reviewer_0_meta.json +148 -0
  19. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/50004a9d_reviewer_0_output.md +4 -0
  20. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/50004a9d_reviewer_0_transcript.jsonl +117 -0
  21. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/62ce02df_researcher_0_input.md +60 -0
  22. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/62ce02df_researcher_0_meta.json +198 -0
  23. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/62ce02df_researcher_0_output.md +5 -0
  24. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/62ce02df_researcher_0_transcript.jsonl +181 -0
  25. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/658da225_researcher_0_input.md +58 -0
  26. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/658da225_researcher_0_meta.json +140 -0
  27. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/658da225_researcher_0_output.md +3 -0
  28. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/658da225_researcher_0_transcript.jsonl +143 -0
  29. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/77bdf31b_reviewer_0_input.md +56 -0
  30. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/77bdf31b_reviewer_0_meta.json +153 -0
  31. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/77bdf31b_reviewer_0_output.md +5 -0
  32. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/77bdf31b_reviewer_0_transcript.jsonl +91 -0
  33. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/7e872312_researcher_0_input.md +54 -0
  34. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/7e872312_researcher_0_meta.json +145 -0
  35. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/7e872312_researcher_0_output.md +9 -0
  36. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/7e872312_researcher_0_transcript.jsonl +64 -0
  37. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/80000f4f_reviewer_0_input.md +56 -0
  38. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/80000f4f_reviewer_0_meta.json +162 -0
  39. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/80000f4f_reviewer_0_output.md +43 -0
  40. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/80000f4f_reviewer_0_transcript.jsonl +247 -0
  41. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/936a7816_reviewer_input.md +65 -0
  42. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/936a7816_reviewer_meta.json +134 -0
  43. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/936a7816_reviewer_output.md +3 -0
  44. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/936a7816_reviewer_transcript.jsonl +95 -0
  45. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/9b5edec9_researcher_0_input.md +60 -0
  46. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/9b5edec9_researcher_0_meta.json +138 -0
  47. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/9b5edec9_researcher_0_output.md +3 -0
  48. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/9b5edec9_researcher_0_transcript.jsonl +128 -0
  49. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/a7ba15b7_reviewer_0_input.md +61 -0
  50. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/a7ba15b7_reviewer_0_meta.json +154 -0
  51. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/a7ba15b7_reviewer_0_output.md +6 -0
  52. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/a7ba15b7_reviewer_0_transcript.jsonl +120 -0
  53. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/ae45c617_oracle_0_input.md +63 -0
  54. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/ae45c617_oracle_0_meta.json +139 -0
  55. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/ae45c617_oracle_0_output.md +132 -0
  56. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/ae45c617_oracle_0_transcript.jsonl +32 -0
  57. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/da2585c5_reviewer_0_input.md +56 -0
  58. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/da2585c5_reviewer_0_meta.json +144 -0
  59. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/da2585c5_reviewer_0_output.md +5 -0
  60. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/da2585c5_reviewer_0_transcript.jsonl +142 -0
  61. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/e7de5dda_reviewer_input.md +65 -0
  62. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/e7de5dda_reviewer_meta.json +135 -0
  63. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/e7de5dda_reviewer_output.md +13 -0
  64. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/e7de5dda_reviewer_transcript.jsonl +23 -0
  65. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f409f5cb_reviewer_0_input.md +60 -0
  66. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f409f5cb_reviewer_0_meta.json +153 -0
  67. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f409f5cb_reviewer_0_output.md +9 -0
  68. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f409f5cb_reviewer_0_transcript.jsonl +131 -0
  69. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f93a8c4e_reviewer_0_input.md +56 -0
  70. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f93a8c4e_reviewer_0_meta.json +152 -0
  71. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f93a8c4e_reviewer_0_output.md +6 -0
  72. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/f93a8c4e_reviewer_0_transcript.jsonl +111 -0
  73. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/outputs/62ce02df/.scratch/securitytxt-control-panel/research-agent-output.md +123 -0
  74. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/outputs/9b5edec9/research.md +180 -0
  75. plone_securitytxt-1.0.0b1/.pi-subagents/artifacts/outputs/ae45c617/.pi-subagents/implementation-plan.md +132 -0
  76. plone_securitytxt-1.0.0b1/.pi-subagents/missions/46cc410e-fba0-40db-abef-248e401208e3.json +137 -0
  77. plone_securitytxt-1.0.0b1/.pi-subagents/missions/492f9ce8-2358-4d0f-8f6b-42c5777b6d0e.json +39 -0
  78. plone_securitytxt-1.0.0b1/.pi-subagents/missions/5620fe14-ab73-4df4-aa4c-3f5498bfca13.json +39 -0
  79. plone_securitytxt-1.0.0b1/.pi-subagents/missions/569b005b-7eb0-4474-9ea1-0adf6f84b360.json +61 -0
  80. plone_securitytxt-1.0.0b1/.pi-subagents/missions/57b0209d-6d94-4bbb-8444-4d0e8056e84e.json +24 -0
  81. plone_securitytxt-1.0.0b1/.pi-subagents/missions/7c41d3f3-19f7-4f34-b759-0586104a5a5c.json +86 -0
  82. plone_securitytxt-1.0.0b1/.pi-subagents/missions/8057b9dc-f5b4-49e3-a014-0d350cffdf1f.json +86 -0
  83. plone_securitytxt-1.0.0b1/.pi-subagents/missions/fed61d4e-ed50-43af-a331-2dad1b49b270.json +86 -0
  84. plone_securitytxt-1.0.0b1/.pre-commit-config.yaml +14 -0
  85. plone_securitytxt-1.0.0b1/.sandboxsh.json +21 -0
  86. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/01-establish-standards-baseline.md +18 -0
  87. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/02-define-policy-field-model.md +64 -0
  88. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/03-define-publication-http-semantics.md +50 -0
  89. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/04-prototype-control-panel.md +47 -0
  90. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/05-evaluate-openpgp-approaches.md +19 -0
  91. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/06-define-signing-contract.md +126 -0
  92. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/07-confirm-plone-integration-seams.md +18 -0
  93. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/08-choose-integration-architecture.md +75 -0
  94. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/issues/09-define-release-acceptance.md +133 -0
  95. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/map.md +52 -0
  96. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/prototypes/control-panel.html +326 -0
  97. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/research/openpgp-signing-approaches.md +115 -0
  98. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/research/plone-integration-seams.md +133 -0
  99. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/research/release-compatibility.md +180 -0
  100. plone_securitytxt-1.0.0b1/.scratch/securitytxt-control-panel/research/securitytxt-standards-baseline.md +121 -0
  101. plone_securitytxt-1.0.0b1/AGENTS.md +15 -0
  102. plone_securitytxt-1.0.0b1/CHANGELOG.md +8 -0
  103. plone_securitytxt-1.0.0b1/CLAUDE.md +5 -0
  104. plone_securitytxt-1.0.0b1/CONTEXT.md +33 -0
  105. plone_securitytxt-1.0.0b1/PKG-INFO +107 -0
  106. plone_securitytxt-1.0.0b1/README.md +66 -0
  107. plone_securitytxt-1.0.0b1/docs/adr/0001-authoritative-security-policy-application-module.md +3 -0
  108. plone_securitytxt-1.0.0b1/docs/adr/0002-retain-exact-publication-artifacts.md +3 -0
  109. plone_securitytxt-1.0.0b1/docs/agents/domain.md +21 -0
  110. plone_securitytxt-1.0.0b1/docs/agents/issue-tracker.md +30 -0
  111. plone_securitytxt-1.0.0b1/docs/agents/triage-labels.md +11 -0
  112. plone_securitytxt-1.0.0b1/docs/deployment.md +9 -0
  113. plone_securitytxt-1.0.0b1/docs/rest-api.md +14 -0
  114. plone_securitytxt-1.0.0b1/docs/security-policy.md +9 -0
  115. plone_securitytxt-1.0.0b1/docs/signing.md +13 -0
  116. plone_securitytxt-1.0.0b1/pyproject.toml +134 -0
  117. plone_securitytxt-1.0.0b1/sources/.gitkeep +0 -0
  118. plone_securitytxt-1.0.0b1/src/plone/securitytxt/__init__.py +8 -0
  119. plone_securitytxt-1.0.0b1/src/plone/securitytxt/configure.zcml +47 -0
  120. plone_securitytxt-1.0.0b1/src/plone/securitytxt/controlpanels/__init__.py +1 -0
  121. plone_securitytxt-1.0.0b1/src/plone/securitytxt/controlpanels/configure.zcml +13 -0
  122. plone_securitytxt-1.0.0b1/src/plone/securitytxt/controlpanels/security_policy.pt +81 -0
  123. plone_securitytxt-1.0.0b1/src/plone/securitytxt/controlpanels/security_policy.py +356 -0
  124. plone_securitytxt-1.0.0b1/src/plone/securitytxt/i18n.py +5 -0
  125. plone_securitytxt-1.0.0b1/src/plone/securitytxt/interfaces.py +7 -0
  126. plone_securitytxt-1.0.0b1/src/plone/securitytxt/locales/README.rst +37 -0
  127. plone_securitytxt-1.0.0b1/src/plone/securitytxt/locales/__init__.py +0 -0
  128. plone_securitytxt-1.0.0b1/src/plone/securitytxt/locales/de/LC_MESSAGES/plone.securitytxt.po +518 -0
  129. plone_securitytxt-1.0.0b1/src/plone/securitytxt/locales/en/LC_MESSAGES/plone.securitytxt.po +516 -0
  130. plone_securitytxt-1.0.0b1/src/plone/securitytxt/locales/plone.securitytxt.pot +519 -0
  131. plone_securitytxt-1.0.0b1/src/plone/securitytxt/locales/update.py +74 -0
  132. plone_securitytxt-1.0.0b1/src/plone/securitytxt/locales/update.sh +12 -0
  133. plone_securitytxt-1.0.0b1/src/plone/securitytxt/permissions.zcml +13 -0
  134. plone_securitytxt-1.0.0b1/src/plone/securitytxt/policy.py +890 -0
  135. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/default/browserlayer.xml +7 -0
  136. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/default/catalog.xml +5 -0
  137. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/default/controlpanel.xml +18 -0
  138. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/default/metadata.xml +7 -0
  139. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/default/rolemap.xml +9 -0
  140. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/uninstall/browserlayer.xml +7 -0
  141. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/uninstall/controlpanel.xml +4 -0
  142. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/uninstall/metadata.xml +4 -0
  143. plone_securitytxt-1.0.0b1/src/plone/securitytxt/profiles/uninstall/rolemap.xml +6 -0
  144. plone_securitytxt-1.0.0b1/src/plone/securitytxt/publisher.py +102 -0
  145. plone_securitytxt-1.0.0b1/src/plone/securitytxt/services/__init__.py +1 -0
  146. plone_securitytxt-1.0.0b1/src/plone/securitytxt/services/configure.zcml +30 -0
  147. plone_securitytxt-1.0.0b1/src/plone/securitytxt/services/security_policy.py +130 -0
  148. plone_securitytxt-1.0.0b1/src/plone/securitytxt/setuphandlers.py +31 -0
  149. plone_securitytxt-1.0.0b1/src/plone/securitytxt/signing.py +175 -0
  150. plone_securitytxt-1.0.0b1/src/plone/securitytxt/signing_helper.py +133 -0
  151. plone_securitytxt-1.0.0b1/src/plone/securitytxt/testing.py +58 -0
  152. plone_securitytxt-1.0.0b1/src/plone/securitytxt/viewlets/__init__.py +1 -0
  153. plone_securitytxt-1.0.0b1/src/plone/securitytxt/viewlets/configure.zcml +15 -0
  154. plone_securitytxt-1.0.0b1/src/plone/securitytxt/viewlets/security_policy_warning.pt +11 -0
  155. plone_securitytxt-1.0.0b1/src/plone/securitytxt/viewlets/security_policy_warning.py +30 -0
  156. plone_securitytxt-1.0.0b1/tasks.py +134 -0
  157. plone_securitytxt-1.0.0b1/tests/__init__.py +0 -0
  158. plone_securitytxt-1.0.0b1/tests/conftest.py +21 -0
  159. plone_securitytxt-1.0.0b1/tests/test_controlpanel_e2e.py +81 -0
  160. plone_securitytxt-1.0.0b1/tests/test_controlpanel_security_policy.py +80 -0
  161. plone_securitytxt-1.0.0b1/tests/test_locales.py +96 -0
  162. plone_securitytxt-1.0.0b1/tests/test_policy_application.py +235 -0
  163. plone_securitytxt-1.0.0b1/tests/test_publisher.py +134 -0
  164. plone_securitytxt-1.0.0b1/tests/test_service_security_policy.py +140 -0
  165. plone_securitytxt-1.0.0b1/tests/test_setup.py +61 -0
  166. plone_securitytxt-1.0.0b1/tests/test_signing.py +52 -0
  167. plone_securitytxt-1.0.0b1/tests/test_viewlet_security_policy_warning.py +76 -0
  168. plone_securitytxt-1.0.0b1/uv.lock +6584 -0
  169. plone_securitytxt-1.0.0b1/var/instance/etc/zope.conf +23 -0
  170. plone_securitytxt-1.0.0b1/var/instance/etc/zope.ini +49 -0
@@ -0,0 +1,14 @@
1
+ # Do not edit this file manually.
2
+ # This file is auto-generated by Copier.
3
+ # Changes here will be overwritten when you update the template.
4
+ _src_path: /home/maik/.copier-templates/plone-copier-templates/backend_addon
5
+ author_email: md@derico.de
6
+ author_name: Maik Derstappen
7
+ github_organization: collective
8
+ is_headless: false
9
+ package_description: A Plone addon to generate and provide a security.txt for the
10
+ Plone website.
11
+ package_name: plone.securitytxt
12
+ package_title: Plone security.txt
13
+ plone_version: '6.0'
14
+
@@ -0,0 +1,8 @@
1
+ # Changes here will be overwritten by Copier
2
+ _src_path: /home/maik/.copier-templates/plone-copier-templates/zope_instance
3
+ base_path: var
4
+ db_storage: instance
5
+ initial_zope_username: admin
6
+ instance_name: instance
7
+ port: 8080
8
+
@@ -0,0 +1,10 @@
1
+ # Do not edit this file manually.
2
+ # This file is auto-generated by Copier.
3
+ # Changes here will be overwritten when you update the template.
4
+ _src_path: /home/maik/.copier-templates/plone-copier-templates/zope-setup
5
+ author_email: md@derico.de
6
+ author_name: Maik Derstappen
7
+ distribution: plone.classicui
8
+ initial_zope_username: admin
9
+ plone_version: 6.2.1
10
+
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "plone.securitytxt",
3
+ "dirs": [
4
+ "."
5
+ ]
6
+ }
@@ -0,0 +1,21 @@
1
+ [*]
2
+ charset = utf-8
3
+ end_of_line = lf
4
+ indent_style = space
5
+ insert_final_newline = true
6
+ trim_trailing_whitespace = true
7
+
8
+ [*.py]
9
+ indent_size = 4
10
+
11
+ [*.{cfg,ini,toml}]
12
+ indent_size = 4
13
+
14
+ [*.{xml,zcml,html,pt,zpt}]
15
+ indent_size = 2
16
+
17
+ [*.{css,js,json}]
18
+ indent_size = 2
19
+
20
+ [*.{yml,yaml}]
21
+ indent_size = 2
@@ -0,0 +1,73 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+ branches: [main, master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ include:
16
+ - {plone: "6.0.15", python: "3.10"}
17
+ - {plone: "6.0.15", python: "3.11"}
18
+ - {plone: "6.0.15", python: "3.12"}
19
+ - {plone: "6.0.15", python: "3.13"}
20
+ - {plone: "6.1.5", python: "3.10"}
21
+ - {plone: "6.1.5", python: "3.11"}
22
+ - {plone: "6.1.5", python: "3.12"}
23
+ - {plone: "6.1.5", python: "3.13"}
24
+ - {plone: "6.2.1", python: "3.10"}
25
+ - {plone: "6.2.1", python: "3.11"}
26
+ - {plone: "6.2.1", python: "3.12"}
27
+ - {plone: "6.2.1", python: "3.13"}
28
+ - {plone: "6.2.1", python: "3.14"}
29
+
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - uses: actions/setup-python@v5
33
+ with:
34
+ python-version: ${{ matrix.python }}
35
+ cache: pip
36
+ - name: Install the supported Plone boundary
37
+ run: |
38
+ python -m pip install --upgrade pip
39
+ pip install \
40
+ -c "https://dist.plone.org/release/${{ matrix.plone }}/constraints.txt" \
41
+ -e ".[test]"
42
+ - name: Record resolved versions
43
+ run: |
44
+ python -c "import platform, Products.CMFPlone; print(platform.python_version(), Products.CMFPlone.__version__)"
45
+ pip show Plone plone.restapi
46
+ - run: pytest -v
47
+
48
+ base-smoke:
49
+ strategy:
50
+ matrix:
51
+ os: [windows-latest, macos-latest]
52
+ python: ["3.10", "3.14"]
53
+ runs-on: ${{ matrix.os }}
54
+ steps:
55
+ - uses: actions/checkout@v4
56
+ - uses: actions/setup-python@v5
57
+ with:
58
+ python-version: ${{ matrix.python }}
59
+ - run: pip install build
60
+ - run: python -m build
61
+ - run: pip install dist/*.whl
62
+ shell: bash
63
+ - run: python -c "import plone.securitytxt.policy, plone.securitytxt.publisher; import sys; assert 'gnupg' not in sys.modules"
64
+
65
+ lint:
66
+ runs-on: ubuntu-latest
67
+ steps:
68
+ - uses: actions/checkout@v4
69
+ - uses: actions/setup-python@v5
70
+ with:
71
+ python-version: "3.12"
72
+ - run: pip install ruff
73
+ - run: ruff check .
@@ -0,0 +1,94 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ wheels/
22
+ *.egg-info/
23
+ .installed.cfg
24
+ *.egg
25
+
26
+ # PyInstaller
27
+ *.manifest
28
+ *.spec
29
+
30
+ # Installer logs
31
+ pip-log.txt
32
+ pip-delete-this-directory.txt
33
+
34
+ # Unit test / coverage reports
35
+ htmlcov/
36
+ .tox/
37
+ .nox/
38
+ .coverage
39
+ .coverage.*
40
+ .cache
41
+ nosetests.xml
42
+ coverage.xml
43
+ *.cover
44
+ *.py,cover
45
+ .hypothesis/
46
+ .pytest_cache/
47
+
48
+ # Translations (compiled catalogs are generated; .pot/.po are tracked)
49
+ *.mo
50
+
51
+ # Environments
52
+ .env
53
+ .venv
54
+ env/
55
+ venv/
56
+ ENV/
57
+ env.bak/
58
+ venv.bak/
59
+
60
+ # Type checkers / linters
61
+ .mypy_cache/
62
+ .pyre/
63
+ .pytype/
64
+ .ruff_cache/
65
+
66
+ # IDEs
67
+ .idea/
68
+ .vscode/
69
+ *.swp
70
+ *.swo
71
+ *~
72
+
73
+ # Node / frontend tooling
74
+ node_modules/
75
+ npm-debug.log*
76
+ yarn-debug.log*
77
+ yarn-error.log*
78
+ pnpm-debug.log*
79
+ .pnpm-store/
80
+ .parcel-cache/
81
+ .vite/
82
+
83
+ # Plone / Zope runtime data
84
+ var/*/inituser
85
+ var/*/var/
86
+ *.fs
87
+ *.fs.index
88
+ *.fs.lock
89
+ *.fs.tmp
90
+ blobs/
91
+
92
+ # Project specific
93
+ *.log
94
+ .DS_Store
@@ -0,0 +1,4 @@
1
+ {
2
+ "agent_name": "plone.securitytxt",
3
+ "auto_start_relay": true
4
+ }
@@ -0,0 +1,60 @@
1
+ # Task for reviewer
2
+
3
+ [Read from: /workspaces/plone.securitytxt/plan.md, /workspaces/plone.securitytxt/progress.md]
4
+
5
+ Re-review the final implementation in /workspaces/plone.securitytxt after fixes.
6
+ Diff command: git diff df6a0a4...HEAD
7
+ Commits: 537c166 Implement security.txt policy control panel; 93f4e36 Harden policy signing and management UI
8
+ Spec source: .scratch/securitytxt-control-panel/map.md and all .scratch/securitytxt-control-panel/issues/*.md.
9
+ Verify especially: emergency signing profile invalidation, malformed REST JSON atomicity, signing key/digest prerequisites, and Classic UI lifecycle/preview/confirmation. Report only remaining missing/incorrect requirements or material scope creep, quoting spec lines. Prioritize release blockers. Under 350 words. Do not edit.
10
+
11
+ ## Acceptance Contract
12
+ Acceptance level: attested
13
+ Completion is not accepted from prose alone. End with a structured acceptance report.
14
+
15
+ Criteria:
16
+ - criterion-1: Return concrete findings with file paths and severity when applicable
17
+
18
+ Required evidence: review-findings, residual-risks
19
+
20
+ Finish with a fenced JSON block tagged `acceptance-report` in this shape:
21
+ Use empty arrays when no items apply; array fields contain strings unless object entries are shown.
22
+ `criteriaSatisfied[].status` must be exactly one of: satisfied, not-satisfied, not-applicable.
23
+ `commandsRun[].result` must be exactly one of: passed, failed, not-run.
24
+ `manualNotes` and `notes` are optional strings; an empty string means no note and does not satisfy `manual-notes` evidence.
25
+ ```acceptance-report
26
+ {
27
+ "criteriaSatisfied": [
28
+ {
29
+ "id": "criterion-1",
30
+ "status": "satisfied",
31
+ "evidence": "specific proof"
32
+ }
33
+ ],
34
+ "changedFiles": [
35
+ "src/file.ts"
36
+ ],
37
+ "testsAddedOrUpdated": [
38
+ "test/file.test.ts"
39
+ ],
40
+ "commandsRun": [
41
+ {
42
+ "command": "command",
43
+ "result": "passed",
44
+ "summary": "short result"
45
+ }
46
+ ],
47
+ "validationOutput": [
48
+ "validation output or concise summary"
49
+ ],
50
+ "residualRisks": [
51
+ "none"
52
+ ],
53
+ "noStagedFiles": true,
54
+ "diffSummary": "short description of the diff",
55
+ "reviewFindings": [
56
+ "blocker: file.ts:12 - issue found, or no blockers"
57
+ ],
58
+ "manualNotes": "anything else the parent should know"
59
+ }
60
+ ```
@@ -0,0 +1,154 @@
1
+ {
2
+ "runId": "30886047",
3
+ "agent": "reviewer",
4
+ "task": "[Read from: /workspaces/plone.securitytxt/plan.md, /workspaces/plone.securitytxt/progress.md]\n\nRe-review the final implementation in /workspaces/plone.securitytxt after fixes.\nDiff command: git diff df6a0a4...HEAD\nCommits: 537c166 Implement security.txt policy control panel; 93f4e36 Harden policy signing and management UI\nSpec source: .scratch/securitytxt-control-panel/map.md and all .scratch/securitytxt-control-panel/issues/*.md.\nVerify especially: emergency signing profile invalidation, malformed REST JSON atomicity, signing key/digest prerequisites, and Classic UI lifecycle/preview/confirmation. Report only remaining missing/incorrect requirements or material scope creep, quoting spec lines. Prioritize release blockers. Under 350 words. Do not edit.",
5
+ "exitCode": 0,
6
+ "processSignal": "SIGTERM",
7
+ "usage": {
8
+ "input": 72885,
9
+ "output": 4819,
10
+ "cacheRead": 505344,
11
+ "cacheWrite": 0,
12
+ "cost": 0.7616670000000002,
13
+ "turns": 13
14
+ },
15
+ "model": "openai-codex/gpt-5.6-sol:high",
16
+ "attemptedModels": [
17
+ "openai-codex/gpt-5.6-sol:high"
18
+ ],
19
+ "modelAttempts": [
20
+ {
21
+ "model": "openai-codex/gpt-5.6-sol:high",
22
+ "success": true,
23
+ "exitCode": 0,
24
+ "usage": {
25
+ "input": 72885,
26
+ "output": 4819,
27
+ "cacheRead": 505344,
28
+ "cacheWrite": 0,
29
+ "cost": 0.7616670000000002,
30
+ "turns": 13
31
+ }
32
+ }
33
+ ],
34
+ "durationMs": 124660,
35
+ "toolCount": 28,
36
+ "launchContractDigest": "223a707071e246b087e3812ad08e38705be15790c26680b9bdf222356f5e4e59",
37
+ "launchResolvedExtensions": {
38
+ "version": 1,
39
+ "source": "launch-resolved",
40
+ "disableAmbientExtensions": false,
41
+ "runtime": [
42
+ "sha256:49e048d05a5c5d6f"
43
+ ],
44
+ "configured": [],
45
+ "effective": [
46
+ "sha256:49e048d05a5c5d6f"
47
+ ],
48
+ "omitted": {
49
+ "runtime": 0,
50
+ "configured": 0,
51
+ "effective": 0
52
+ }
53
+ },
54
+ "acceptance": {
55
+ "status": "attested",
56
+ "evidenceStatus": "attested",
57
+ "explicit": false,
58
+ "effectiveAcceptance": {
59
+ "level": "attested",
60
+ "explicit": false,
61
+ "inferredReason": [
62
+ "read-only/reviewer-style agent"
63
+ ],
64
+ "criteria": [
65
+ {
66
+ "id": "criterion-1",
67
+ "must": "Return concrete findings with file paths and severity when applicable",
68
+ "evidence": [
69
+ "review-findings",
70
+ "residual-risks"
71
+ ],
72
+ "severity": "required"
73
+ }
74
+ ],
75
+ "evidence": [
76
+ "review-findings",
77
+ "residual-risks"
78
+ ],
79
+ "verify": [],
80
+ "stopRules": []
81
+ },
82
+ "inferredReason": [
83
+ "read-only/reviewer-style agent"
84
+ ],
85
+ "criteria": [
86
+ {
87
+ "id": "criterion-1",
88
+ "must": "Return concrete findings with file paths and severity when applicable",
89
+ "evidence": [
90
+ "review-findings",
91
+ "residual-risks"
92
+ ],
93
+ "severity": "required"
94
+ }
95
+ ],
96
+ "runtimeChecks": [],
97
+ "verifyRuns": [],
98
+ "childReport": {
99
+ "criteriaSatisfied": [
100
+ {
101
+ "id": "criterion-1",
102
+ "status": "satisfied",
103
+ "evidence": "Four concrete findings include severity, paths, lines, reproductions, and quoted requirements."
104
+ }
105
+ ],
106
+ "changedFiles": [
107
+ "src/plone/securitytxt/policy.py",
108
+ "src/plone/securitytxt/signing_helper.py",
109
+ "src/plone/securitytxt/services/security_policy.py",
110
+ "src/plone/securitytxt/controlpanels/security_policy.py"
111
+ ],
112
+ "testsAddedOrUpdated": [
113
+ "tests/test_signing.py",
114
+ "tests/test_service_security_policy.py",
115
+ "tests/test_controlpanel_security_policy.py"
116
+ ],
117
+ "commandsRun": [
118
+ {
119
+ "command": "git diff --check df6a0a4...HEAD && uv run pytest -q",
120
+ "result": "passed",
121
+ "summary": "28 passed"
122
+ },
123
+ {
124
+ "command": "targeted Python reproductions",
125
+ "result": "passed",
126
+ "summary": "Confirmed nonexistent-profile save and UnicodeDecodeError"
127
+ }
128
+ ],
129
+ "validationOutput": [
130
+ "Emergency loaded-profile revision/disable invalidation is implemented and tested."
131
+ ],
132
+ "residualRisks": [
133
+ "No real-GnuPG or semantic browser coverage."
134
+ ],
135
+ "noStagedFiles": true,
136
+ "diffSummary": "Control panel, REST, policy publication, and optional signing implementation.",
137
+ "reviewFindings": [
138
+ "blocker: signed draft accepts nonexistent profiles",
139
+ "blocker: required signing verification coverage absent",
140
+ "major: Classic UI lifecycle contract incomplete",
141
+ "major: malformed UTF-8 returns 500"
142
+ ]
143
+ }
144
+ },
145
+ "effects": {
146
+ "fileMutation": {
147
+ "status": "not-applicable",
148
+ "expected": false,
149
+ "attempted": true
150
+ }
151
+ },
152
+ "transcriptPath": "/workspaces/plone.securitytxt/.pi-subagents/artifacts/30886047_reviewer_0_transcript.jsonl",
153
+ "timestamp": 1786465606802
154
+ }
@@ -0,0 +1,5 @@
1
+ ## Review
2
+ - **Blocker:** `policy.py:337-345,591-619` saves Signed mode with a nonexistent profile; reproduced as revision 2. Spec `06:67`: “Saving that choice requires the profile to exist”; `06:63`: Signed mode “cannot be newly selected” without signing support.
3
+ - **Blocker:** Signing prerequisites are untested: `tests/test_signing.py:12-52` only validates profile parsing—none of `signing_helper.py`. Spec `09:107` requires exact-subkey, RSA/key-size/SHA-256, expiry/revocation, malformed output, timeout, and real-GnuPG coverage.
4
+ - **Major:** Classic UI remains lifecycle-incomplete. `controlpanels/security_policy.py:123-133,180-217` always exposes both Publish/Disable, always says “Save draft,” has a generic publish confirmation, and test-signing ignores unsaved form values. No inline domain diagnostics or public key identity is rendered. This conflicts with `04:28-31,36-41`, including “either Publish or Disable,” lifecycle gating, confirmation summarizing endpoint/expiry/signing mode, and inline feedback.
5
+ - **Major:** `services/security_policy.py:108-116` decodes UTF-8 outside error handling; malformed bytes raise `UnicodeDecodeError` rather than structured `400`. Persistence remains atomic, but `09:75` requires “structured field/global errors without partial writes.”