From 20adea75448b0a82fec671eb9f3cd3d59f811030 Mon Sep 17 00:00:00 2001 From: Edwin Noorlander Date: Sat, 15 Aug 2026 19:21:04 +0200 Subject: [PATCH] v2.6.0: Content backup/git versioning, plugin type system, docs update New features: - ContentBackup class with ZIP backup/restore and git versioning - Admin backup & restore page (content-backup.twig) with git init/commit/log/restore - Plugin type system: system (blue) vs content (green) with visual badges - PluginAPIInterface + AdminPluginAPI for plugin architecture - Essential plugin flag (cannot edit/deactivate/delete) Improvements: - Consolidated enabled_plugins config (removed plugins.enabled) - Removed Analytics/Logging toggles from admin config page - Fixed Dashboard plugin Twig comments rendered as text - Updated 20 guide files (NL+EN): configuratie, plugins, plugin-development, core-classes, theme-json, layouts, scss-styling, admin-beheerder, nieuw-thema, architectuur - Improved accessibility test script (grep -E, min/max checks) Cleanup: - Removed unused classes: ARIAComponents, AccessibilityManager, ContentSecurityPolicy, etc. - Removed vendor packages: mustache/mustache, php-mqtt/client - Removed old templates: logs.twig, statistics.twig (now plugins) - Moved language files to language/ directory Tests: - Pentest: 30/30 passed, 0 vulnerabilities - WCAG 2.1 AA: 25/25 passed, 100% compliance --- .gitignore | 13 +- AGENTS.md | 46 +- README.en.md | 2 +- README.md | 2 +- TODO.md | 51 +- admin/config/admin.json.example | 21 + admin/src/AdminAuth.php | 45 +- admin/theme/default/views/layouts/admin.twig | 75 +- admin/theme/default/views/login.twig | 16 +- admin/theme/default/views/pages/config.twig | 126 +- .../default/views/pages/content-backup.twig | 128 + .../default/views/pages/content-dir-form.twig | 12 +- .../default/views/pages/content-edit.twig | 22 +- .../views/pages/content-move-form.twig | 14 +- .../default/views/pages/content-new.twig | 18 +- admin/theme/default/views/pages/content.twig | 65 +- .../theme/default/views/pages/dashboard.twig | 241 +- admin/theme/default/views/pages/error.twig | 8 +- admin/theme/default/views/pages/guide.twig | 8 +- admin/theme/default/views/pages/logs.twig | 62 - admin/theme/default/views/pages/media.twig | 14 +- .../default/views/pages/plugin-config.twig | 10 +- .../default/views/pages/plugin-page.twig | 7 + .../default/views/pages/plugins-edit.twig | 12 +- .../default/views/pages/plugins-new.twig | 14 +- admin/theme/default/views/pages/plugins.twig | 44 +- admin/theme/default/views/pages/security.twig | 22 +- .../theme/default/views/pages/statistics.twig | 80 - .../theme/default/views/pages/theme-new.twig | 14 +- admin/theme/default/views/pages/theme.twig | 22 +- admin/theme/default/views/pages/update.twig | 18 +- admin/theme/default/views/pages/users.twig | 97 +- cli/test/accessibility.sh | 102 +- cli/test/functional/function-test.md | 661 ----- cli/test/functional/test-report.md | 543 ---- cli/test/functional/test-report_v1.5.0.md | 107 - cli/test/pentest/pentest_results.md | 346 --- cli/test/pentest/pentest_results.txt | 72 - cms/core/class/ARIAComponents.php | 390 --- cms/core/class/AccessibilityManager.php | 747 ----- cms/core/class/AccessibleTemplate.php | 324 --- cms/core/class/AssetManager.php | 69 - cms/core/class/CodePressCMS.php | 155 +- cms/core/class/CodePressCMS.php.backup | 1322 --------- cms/core/class/ContentBackup.php | 401 +++ cms/core/class/ContentSecurityPolicy.php | 50 - cms/core/class/EnhancedSecurity.php | 419 --- cms/core/class/SearchEngine.php | 127 - cms/core/class/SimpleTemplate.php | 144 - cms/core/config.php | 5 +- cms/core/index.php | 7 +- cms/core/plugin/AdminPluginAPI.php | 82 + cms/core/plugin/CMSAPI.php | 2 +- cms/core/plugin/PluginAPIInterface.php | 10 + cms/core/plugin/PluginManager.php | 72 +- composer.json | 2 - config.json.example | 10 +- docs/release-notes/v2.6.0.md | 116 + guide/en/admin-beheerder.md | 2 + guide/en/admin-beheerder/configuratie.md | 14 +- guide/en/admin-beheerder/plugins.md | 21 +- guide/en/codepress-developer/architectuur.md | 25 +- guide/en/codepress-developer/core-classes.md | 52 +- .../codepress-developer/plugin-development.md | 133 +- guide/en/theme-developer/layouts.md | 13 +- guide/en/theme-developer/nieuw-thema.md | 3 +- guide/en/theme-developer/scss-styling.md | 2 +- guide/en/theme-developer/theme-json.md | 20 +- guide/nl/admin-beheerder.md | 2 + guide/nl/admin-beheerder/configuratie.md | 14 +- guide/nl/admin-beheerder/plugins.md | 21 +- guide/nl/codepress-developer/architectuur.md | 25 +- guide/nl/codepress-developer/core-classes.md | 52 +- .../codepress-developer/plugin-development.md | 133 +- guide/nl/theme-developer/layouts.md | 13 +- guide/nl/theme-developer/nieuw-thema.md | 3 +- guide/nl/theme-developer/scss-styling.md | 2 +- guide/nl/theme-developer/theme-json.md | 20 +- language/de/admin.php | 252 ++ language/de/site.php | 38 + language/en/admin.php | 252 ++ cms/lang/en.php => language/en/site.php | 4 +- language/nl/admin.php | 252 ++ cms/lang/nl.php => language/nl/site.php | 4 +- plugins/Dashboard/Dashboard.php | 234 ++ plugins/Dashboard/plugin.json | 9 + plugins/HTMLBlock/HTMLBlock.php | 7 +- plugins/HTMLBlock/plugin.json | 9 + plugins/Logs/Logs.php | 101 + plugins/Logs/plugin.json | 9 + plugins/Navigation/Navigation.php | 5 +- plugins/Navigation/plugin.json | 5 +- plugins/Statistics/Statistics.php | 147 + plugins/Statistics/plugin.json | 9 + public/admin.php | 535 +++- public/test-guide.php | 20 - vendor/composer/autoload_psr4.php | 2 - .../mustache/.github/workflows/tests.yml | 47 - vendor/mustache/mustache/.php-cs-fixer.php | 20 - vendor/mustache/mustache/LICENSE | 21 - vendor/mustache/mustache/README.md | 94 - vendor/mustache/mustache/composer.json | 38 - vendor/mustache/mustache/src/Cache.php | 46 - .../mustache/src/Cache/AbstractCache.php | 68 - .../mustache/src/Cache/FilesystemCache.php | 166 -- .../mustache/mustache/src/Cache/NoopCache.php | 51 - vendor/mustache/mustache/src/Compiler.php | 807 ------ vendor/mustache/mustache/src/Context.php | 277 -- vendor/mustache/mustache/src/Engine.php | 963 ------- vendor/mustache/mustache/src/Exception.php | 17 - .../Exception/InvalidArgumentException.php | 22 - .../mustache/src/Exception/LogicException.php | 22 - .../src/Exception/RuntimeException.php | 22 - .../src/Exception/SyntaxException.php | 40 - .../src/Exception/UnknownFilterException.php | 38 - .../src/Exception/UnknownHelperException.php | 38 - .../Exception/UnknownTemplateException.php | 38 - .../mustache/src/HelperCollection.php | 177 -- vendor/mustache/mustache/src/LambdaHelper.php | 96 - vendor/mustache/mustache/src/Loader.php | 28 - .../mustache/src/Loader/ArrayLoader.php | 82 - .../mustache/src/Loader/CascadingLoader.php | 72 - .../mustache/src/Loader/FilesystemLoader.php | 141 - .../mustache/src/Loader/InlineLoader.php | 129 - .../mustache/src/Loader/MutableLoader.php | 28 - .../src/Loader/ProductionFilesystemLoader.php | 93 - .../mustache/src/Loader/StringLoader.php | 43 - vendor/mustache/mustache/src/Logger.php | 102 - .../mustache/src/Logger/AbstractLogger.php | 117 - .../mustache/src/Logger/StreamLogger.php | 199 -- vendor/mustache/mustache/src/Parser.php | 392 --- .../mustache/mustache/src/RenderedString.php | 51 - vendor/mustache/mustache/src/Source.php | 39 - .../mustache/src/Source/FilesystemSource.php | 81 - vendor/mustache/mustache/src/Template.php | 193 -- vendor/mustache/mustache/src/Tokenizer.php | 412 --- vendor/mustache/mustache/src/compat.php | 282 -- vendor/php-mqtt/client/.ci/emqx.conf | 2503 ----------------- vendor/php-mqtt/client/.ci/hivemq.xml | 56 - vendor/php-mqtt/client/.ci/mosquitto.conf | 31 - vendor/php-mqtt/client/.ci/mosquitto.passwd | 1 - vendor/php-mqtt/client/.ci/rabbitmq.conf | 11 - vendor/php-mqtt/client/.ci/tls/.gitignore | 2 - vendor/php-mqtt/client/.github/dependabot.yml | 23 - vendor/php-mqtt/client/.github/release.yml | 25 - .../.github/workflows/dependency-review.yml | 23 - .../client/.github/workflows/tests.yml | 140 - vendor/php-mqtt/client/.gitignore | 6 - vendor/php-mqtt/client/.phpcs.xml | 88 - vendor/php-mqtt/client/CHANGELOG.md | 72 - vendor/php-mqtt/client/LICENSE.md | 21 - vendor/php-mqtt/client/README.md | 424 --- vendor/php-mqtt/client/composer.json | 53 - vendor/php-mqtt/client/create-certificates.sh | 30 - vendor/php-mqtt/client/phpunit.xml | 34 - .../php-mqtt/client/sonar-project.properties | 18 - .../src/Concerns/GeneratesRandomClientIds.php | 21 - .../client/src/Concerns/OffersHooks.php | 301 -- .../client/src/Concerns/TranscodesData.php | 78 - .../src/Concerns/ValidatesConfiguration.php | 89 - .../client/src/Concerns/WorksWithBuffers.php | 26 - .../client/src/ConnectionSettings.php | 555 ---- .../client/src/Contracts/MessageProcessor.php | 118 - .../client/src/Contracts/MqttClient.php | 266 -- .../client/src/Contracts/Repository.php | 143 - .../ClientNotConnectedToBrokerException.php | 24 - .../ConfigurationInvalidException.php | 15 - .../ConnectingToBrokerFailedException.php | 54 - .../src/Exceptions/DataTransferException.php | 27 - .../Exceptions/InvalidMessageException.php | 14 - .../src/Exceptions/MqttClientException.php | 29 - .../PendingMessageAlreadyExistsException.php | 21 - .../PendingMessageNotFoundException.php | 21 - .../ProtocolNotSupportedException.php | 21 - .../Exceptions/ProtocolViolationException.php | 21 - .../src/Exceptions/RepositoryException.php | 14 - vendor/php-mqtt/client/src/Logger.php | 166 -- vendor/php-mqtt/client/src/Message.php | 105 - .../BaseMessageProcessor.php | 32 - .../Mqtt311MessageProcessor.php | 76 - .../Mqtt31MessageProcessor.php | 712 ----- vendor/php-mqtt/client/src/MessageType.php | 37 - vendor/php-mqtt/client/src/MqttClient.php | 1284 --------- vendor/php-mqtt/client/src/PendingMessage.php | 76 - .../php-mqtt/client/src/PublishedMessage.php | 84 - .../src/Repositories/MemoryRepository.php | 232 -- .../php-mqtt/client/src/SubscribeRequest.php | 38 - vendor/php-mqtt/client/src/Subscription.php | 106 - .../client/src/UnsubscribeRequest.php | 38 - .../ActionsWithoutActiveConnectionTest.php | 51 - .../client/tests/Feature/ClientUtilsTest.php | 93 - ...onnectWithCustomConnectionSettingsTest.php | 83 - .../ConnectWithInvalidConfigurationTest.php | 200 -- .../ConnectWithInvalidHostAndPortTest.php | 36 - .../Feature/ConnectWithTlsSettingsTest.php | 136 - .../Feature/ConnectedEventHandlerTest.php | 116 - .../tests/Feature/LoopEventHandlerTest.php | 143 - .../MessageReceivedEventHandlerTest.php | 169 -- .../tests/Feature/PublishEventHandlerTest.php | 96 - .../tests/Feature/PublishSubscribeTest.php | 427 --- .../tests/Feature/SupportedProtocolsTest.php | 47 - vendor/php-mqtt/client/tests/TestCase.php | 45 - .../Mqtt311MessageProcessorTest.php | 365 --- .../Mqtt31MessageProcessorTest.php | 365 --- .../tests/resources/invalid-test-ca.crt | 0 .../resources/invalid-test-certificate.crt | 0 .../resources/invalid-test-certificate.key | 0 version.php | 4 +- 208 files changed, 3763 insertions(+), 22688 deletions(-) create mode 100644 admin/config/admin.json.example create mode 100644 admin/theme/default/views/pages/content-backup.twig delete mode 100644 admin/theme/default/views/pages/logs.twig create mode 100644 admin/theme/default/views/pages/plugin-page.twig delete mode 100644 admin/theme/default/views/pages/statistics.twig delete mode 100644 cli/test/functional/function-test.md delete mode 100644 cli/test/functional/test-report.md delete mode 100644 cli/test/functional/test-report_v1.5.0.md delete mode 100644 cli/test/pentest/pentest_results.md delete mode 100644 cli/test/pentest/pentest_results.txt delete mode 100644 cms/core/class/ARIAComponents.php delete mode 100644 cms/core/class/AccessibilityManager.php delete mode 100644 cms/core/class/AccessibleTemplate.php delete mode 100644 cms/core/class/AssetManager.php delete mode 100644 cms/core/class/CodePressCMS.php.backup create mode 100644 cms/core/class/ContentBackup.php delete mode 100644 cms/core/class/ContentSecurityPolicy.php delete mode 100644 cms/core/class/EnhancedSecurity.php delete mode 100644 cms/core/class/SearchEngine.php delete mode 100644 cms/core/class/SimpleTemplate.php create mode 100644 cms/core/plugin/AdminPluginAPI.php create mode 100644 cms/core/plugin/PluginAPIInterface.php create mode 100644 docs/release-notes/v2.6.0.md create mode 100644 language/de/admin.php create mode 100644 language/de/site.php create mode 100644 language/en/admin.php rename cms/lang/en.php => language/en/site.php (91%) create mode 100644 language/nl/admin.php rename cms/lang/nl.php => language/nl/site.php (91%) create mode 100644 plugins/Dashboard/Dashboard.php create mode 100644 plugins/Dashboard/plugin.json create mode 100644 plugins/HTMLBlock/plugin.json create mode 100644 plugins/Logs/Logs.php create mode 100644 plugins/Logs/plugin.json create mode 100644 plugins/Statistics/Statistics.php create mode 100644 plugins/Statistics/plugin.json delete mode 100644 public/test-guide.php delete mode 100644 vendor/mustache/mustache/.github/workflows/tests.yml delete mode 100644 vendor/mustache/mustache/.php-cs-fixer.php delete mode 100644 vendor/mustache/mustache/LICENSE delete mode 100644 vendor/mustache/mustache/README.md delete mode 100644 vendor/mustache/mustache/composer.json delete mode 100644 vendor/mustache/mustache/src/Cache.php delete mode 100644 vendor/mustache/mustache/src/Cache/AbstractCache.php delete mode 100644 vendor/mustache/mustache/src/Cache/FilesystemCache.php delete mode 100644 vendor/mustache/mustache/src/Cache/NoopCache.php delete mode 100644 vendor/mustache/mustache/src/Compiler.php delete mode 100644 vendor/mustache/mustache/src/Context.php delete mode 100644 vendor/mustache/mustache/src/Engine.php delete mode 100644 vendor/mustache/mustache/src/Exception.php delete mode 100644 vendor/mustache/mustache/src/Exception/InvalidArgumentException.php delete mode 100644 vendor/mustache/mustache/src/Exception/LogicException.php delete mode 100644 vendor/mustache/mustache/src/Exception/RuntimeException.php delete mode 100644 vendor/mustache/mustache/src/Exception/SyntaxException.php delete mode 100644 vendor/mustache/mustache/src/Exception/UnknownFilterException.php delete mode 100644 vendor/mustache/mustache/src/Exception/UnknownHelperException.php delete mode 100644 vendor/mustache/mustache/src/Exception/UnknownTemplateException.php delete mode 100644 vendor/mustache/mustache/src/HelperCollection.php delete mode 100644 vendor/mustache/mustache/src/LambdaHelper.php delete mode 100644 vendor/mustache/mustache/src/Loader.php delete mode 100644 vendor/mustache/mustache/src/Loader/ArrayLoader.php delete mode 100644 vendor/mustache/mustache/src/Loader/CascadingLoader.php delete mode 100644 vendor/mustache/mustache/src/Loader/FilesystemLoader.php delete mode 100644 vendor/mustache/mustache/src/Loader/InlineLoader.php delete mode 100644 vendor/mustache/mustache/src/Loader/MutableLoader.php delete mode 100644 vendor/mustache/mustache/src/Loader/ProductionFilesystemLoader.php delete mode 100644 vendor/mustache/mustache/src/Loader/StringLoader.php delete mode 100644 vendor/mustache/mustache/src/Logger.php delete mode 100644 vendor/mustache/mustache/src/Logger/AbstractLogger.php delete mode 100644 vendor/mustache/mustache/src/Logger/StreamLogger.php delete mode 100644 vendor/mustache/mustache/src/Parser.php delete mode 100644 vendor/mustache/mustache/src/RenderedString.php delete mode 100644 vendor/mustache/mustache/src/Source.php delete mode 100644 vendor/mustache/mustache/src/Source/FilesystemSource.php delete mode 100644 vendor/mustache/mustache/src/Template.php delete mode 100644 vendor/mustache/mustache/src/Tokenizer.php delete mode 100644 vendor/mustache/mustache/src/compat.php delete mode 100644 vendor/php-mqtt/client/.ci/emqx.conf delete mode 100644 vendor/php-mqtt/client/.ci/hivemq.xml delete mode 100644 vendor/php-mqtt/client/.ci/mosquitto.conf delete mode 100644 vendor/php-mqtt/client/.ci/mosquitto.passwd delete mode 100644 vendor/php-mqtt/client/.ci/rabbitmq.conf delete mode 100644 vendor/php-mqtt/client/.ci/tls/.gitignore delete mode 100644 vendor/php-mqtt/client/.github/dependabot.yml delete mode 100644 vendor/php-mqtt/client/.github/release.yml delete mode 100644 vendor/php-mqtt/client/.github/workflows/dependency-review.yml delete mode 100644 vendor/php-mqtt/client/.github/workflows/tests.yml delete mode 100644 vendor/php-mqtt/client/.gitignore delete mode 100644 vendor/php-mqtt/client/.phpcs.xml delete mode 100644 vendor/php-mqtt/client/CHANGELOG.md delete mode 100644 vendor/php-mqtt/client/LICENSE.md delete mode 100644 vendor/php-mqtt/client/README.md delete mode 100644 vendor/php-mqtt/client/composer.json delete mode 100644 vendor/php-mqtt/client/create-certificates.sh delete mode 100644 vendor/php-mqtt/client/phpunit.xml delete mode 100644 vendor/php-mqtt/client/sonar-project.properties delete mode 100644 vendor/php-mqtt/client/src/Concerns/GeneratesRandomClientIds.php delete mode 100644 vendor/php-mqtt/client/src/Concerns/OffersHooks.php delete mode 100644 vendor/php-mqtt/client/src/Concerns/TranscodesData.php delete mode 100644 vendor/php-mqtt/client/src/Concerns/ValidatesConfiguration.php delete mode 100644 vendor/php-mqtt/client/src/Concerns/WorksWithBuffers.php delete mode 100644 vendor/php-mqtt/client/src/ConnectionSettings.php delete mode 100644 vendor/php-mqtt/client/src/Contracts/MessageProcessor.php delete mode 100644 vendor/php-mqtt/client/src/Contracts/MqttClient.php delete mode 100644 vendor/php-mqtt/client/src/Contracts/Repository.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/ClientNotConnectedToBrokerException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/ConfigurationInvalidException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/ConnectingToBrokerFailedException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/DataTransferException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/InvalidMessageException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/MqttClientException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/PendingMessageAlreadyExistsException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/PendingMessageNotFoundException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/ProtocolNotSupportedException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/ProtocolViolationException.php delete mode 100644 vendor/php-mqtt/client/src/Exceptions/RepositoryException.php delete mode 100644 vendor/php-mqtt/client/src/Logger.php delete mode 100644 vendor/php-mqtt/client/src/Message.php delete mode 100644 vendor/php-mqtt/client/src/MessageProcessors/BaseMessageProcessor.php delete mode 100644 vendor/php-mqtt/client/src/MessageProcessors/Mqtt311MessageProcessor.php delete mode 100644 vendor/php-mqtt/client/src/MessageProcessors/Mqtt31MessageProcessor.php delete mode 100644 vendor/php-mqtt/client/src/MessageType.php delete mode 100644 vendor/php-mqtt/client/src/MqttClient.php delete mode 100644 vendor/php-mqtt/client/src/PendingMessage.php delete mode 100644 vendor/php-mqtt/client/src/PublishedMessage.php delete mode 100644 vendor/php-mqtt/client/src/Repositories/MemoryRepository.php delete mode 100644 vendor/php-mqtt/client/src/SubscribeRequest.php delete mode 100644 vendor/php-mqtt/client/src/Subscription.php delete mode 100644 vendor/php-mqtt/client/src/UnsubscribeRequest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/ActionsWithoutActiveConnectionTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/ClientUtilsTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/ConnectWithCustomConnectionSettingsTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/ConnectWithInvalidConfigurationTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/ConnectWithInvalidHostAndPortTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/ConnectWithTlsSettingsTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/ConnectedEventHandlerTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/LoopEventHandlerTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/MessageReceivedEventHandlerTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/PublishEventHandlerTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/PublishSubscribeTest.php delete mode 100644 vendor/php-mqtt/client/tests/Feature/SupportedProtocolsTest.php delete mode 100644 vendor/php-mqtt/client/tests/TestCase.php delete mode 100644 vendor/php-mqtt/client/tests/Unit/MessageProcessors/Mqtt311MessageProcessorTest.php delete mode 100644 vendor/php-mqtt/client/tests/Unit/MessageProcessors/Mqtt31MessageProcessorTest.php delete mode 100644 vendor/php-mqtt/client/tests/resources/invalid-test-ca.crt delete mode 100644 vendor/php-mqtt/client/tests/resources/invalid-test-certificate.crt delete mode 100644 vendor/php-mqtt/client/tests/resources/invalid-test-certificate.key diff --git a/.gitignore b/.gitignore index 1d63556..dd845fb 100644 --- a/.gitignore +++ b/.gitignore @@ -27,11 +27,22 @@ public/themes/ # Temporary files *.tmp *.temp +.bak/ # Local configuration & credentials config.json +config.*.json +!config.json.example admin/config/admin.json -# No content +# No content (per-domain content dirs included) content/ +content-*/ !content/.gitkeep + +# Test results +pentest_results.* +accessibility-test-results.* +enhanced-test-results.* +cli/test/functional/test-report*.md +cli/test/functional/function-test.md diff --git a/AGENTS.md b/AGENTS.md index 8a1ed74..4ec3c92 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,15 +18,14 @@ codepress/ │ │ ├── class/ │ │ │ ├── CodePressCMS.php # Hoofd CMS class │ │ │ ├── ThemeManager.php # Thema-resolver + Twig render + SCSS compile -│ │ │ ├── Logger.php # Logging systeem -│ │ │ └── SimpleTemplate.php # Legacy Mustache-style engine (niet meer gebruikt) +│ │ │ └── Logger.php # Logging systeem │ │ ├── plugin/ │ │ │ ├── PluginManager.php # Plugin loader │ │ │ └── CMSAPI.php # API voor plugins │ │ ├── config.php # Config loader (leest config.json) │ │ └── index.php # Bootstrap (autoloader, requires) -│ ├── lang/ # Taalbestanden (nl.php, en.php) │ └── router.php # PHP dev server router (serveert ook /themes/) +├── language/ # Taalbestanden (nl/, en/, de/ — elk met site.php + admin.php) ├── themes/ # Dynamische thema's (volledig zelfstandig) │ ├── default/ # Standaard thema │ │ ├── theme.json # { title, default_layout, layout→.twig mapping, kleuren } @@ -34,33 +33,24 @@ codepress/ │ │ ├── full_content.twig # Layout: volledige breedte │ │ ├── left_sidebar.twig # Layout: sidebar links │ │ ├── right_sidebar.twig # Layout: sidebar rechts -│ │ ├── custom1.twig # Layout: custom +│ │ ├── custom1.twig # Layout: custom +│ │ ├── guide.twig # Layout: handleiding │ │ ├── partials/ # header.twig, navigation.twig, footer.twig -│ │ ├── css/theme.scss # SCSS bron (runtime gecompileerd) -│ │ └── js/theme.js # Thema JavaScript +│ │ ├── assets/scss/theme.scss # SCSS bron (runtime gecompileerd) +│ │ └── assets/js/ # app.js, bootstrap.bundle.min.js │ ├── demo/ # Demo thema (zelfde structuur, andere look) -│ └── test/ # Test thema ├── admin/ # Admin paneel │ ├── config/ │ │ ├── app.php # Admin app configuratie -│ │ └── admin.json # Gebruikers & security (file-based) +│ │ ├── admin.json # Gebruikers & security (file-based, gitignored) +│ │ └── admin.json.example # Voorbeeld met placeholder-wachtwoord │ ├── src/ │ │ └── AdminAuth.php # Authenticatie (sessies, bcrypt, CSRF, lockout) -│ ├── templates/ -│ │ ├── login.php # Login pagina -│ │ ├── layout.php # Admin layout met sidebar -│ │ └── pages/ -│ │ ├── dashboard.php -│ │ ├── content.php -│ │ ├── content-edit.php -│ │ ├── content-new.php -│ │ ├── content-dir-form.php -│ │ ├── config.php -│ │ ├── plugins.php -│ │ ├── plugin-config.php -│ │ ├── theme.php -│ │ └── users.php -│ └── storage/logs/ # Admin logs +│ ├── theme/default/views/ # Twig templates +│ │ ├── login.twig # Login pagina +│ │ ├── layouts/admin.twig # Admin layout met sidebar +│ │ └── pages/ # dashboard, content, content-edit, config, plugins, theme, users, statistics, logs, security, update, guide, media, etc. +│ └── storage/logs/ # Admin logs (gedeeld met front-end) ├── cli/ # CLI scripts & tests │ └── test/ │ ├── accessibility.sh # WCAG 2.1 AA test suite @@ -69,7 +59,7 @@ codepress/ │ └── pentest/ # Penetratietesten ├── plugins/ # CMS plugins │ ├── HTMLBlock/ -│ └── MQTTTracker/ +│ └── Navigation/ ├── public/ # Web root │ ├── assets/css/js/ │ ├── index.php # Website entry point @@ -92,7 +82,7 @@ codepress/ - Admin entry point + routing: `public/admin.php` - Admin authenticatie: `admin/src/AdminAuth.php` - **Content**: Stored in `content/`. Supports `.md` (Markdown), `.php` (Dynamic), `.html` (Static). -- **Templating**: Twig templates in `themes//`. `ThemeManager` rendert via Twig en compileert `css/theme.scss` runtime naar `public/themes//theme.css`. Layout gekozen via frontmatter `layout:` key; onbekende layouts vallen terug op `default_layout` in `theme.json`. +- **Templating**: Twig templates in `themes//`. `ThemeManager` rendert via Twig en compileert `assets/scss/theme.scss` runtime naar `public/themes//theme.css`. Layout gekozen via frontmatter `layout:` key; onbekende layouts vallen terug op `default_layout` in `theme.json`. - **Navigation**: Auto-generated from directory structure. Folders require an index file to be clickable in breadcrumbs. - **Security**: - Always use `htmlspecialchars()` for outputting user/content data @@ -104,9 +94,9 @@ codepress/ ## Admin Console - **File-based**: Geen database. Gebruikers opgeslagen in `admin/config/admin.json` - **Routing**: Via `?route=` parameter in `public/admin.php` -- **Routes**: `login`, `logout`, `dashboard`, `content`, `content-edit`, `content-new`, `content-delete`, `config`, `plugins`, `plugins-new`, `plugins-edit`, `plugins-config`, `plugins-toggle`, `plugins-delete`, `users` +- **Routes**: `login`, `logout`, `dashboard`, `content`, `content-edit`, `content-new`, `content-delete`, `content-dir-create`, `content-dir-rename`, `content-dir-delete`, `content-move`, `config`, `plugins`, `plugins-new`, `plugins-edit`, `plugins-config`, `plugins-toggle`, `plugins-delete`, `theme`, `theme-new`, `users`, `security`, `statistics`, `logs`, `guide`, `media`, `update` - **Auth**: Session-based. `AdminAuth` class handelt login, logout, CSRF, brute-force lockout af -- **Templates**: Pure PHP templates in `admin/templates/pages/`. Layout in `layout.php` +- **Templates**: Twig templates in `admin/theme/default/views/`. Layout in `layouts/admin.twig` ## Important: Title vs File/Directory Name Logic - **CRITICAL**: When user asks for "title" corrections, they usually mean **FILE/DIRECTORY NAME WITHOUT LANGUAGE PREFIX AND EXTENSIONS**, not the HTML title from content! @@ -121,5 +111,5 @@ codepress/ ## Bekende aandachtspunten - LSP errors over "Undefined function" in PHP files zijn vals-positief (standaard PHP functies worden niet herkend door de LSP). Negeer deze. - Zie `TODO.md` voor alle openstaande verbeteringen en nieuwe features. -- `vendor/` map bevat Composer dependencies (CommonMark, Twig, scssphp, Mustache). Niet handmatig wijzigen. +- `vendor/` map bevat Composer dependencies (CommonMark, Twig, scssphp, GeoIP2). Niet handmatig wijzigen. - `admin/config/admin.json` bevat wachtwoord-hashes. Niet committen met echte productie-wachtwoorden. diff --git a/README.en.md b/README.en.md index 639716f..97eb303 100644 --- a/README.en.md +++ b/README.en.md @@ -63,8 +63,8 @@ codepress/ ├── cms/ # Core CMS engine │ ├── core/class/ # CMS classes (CodePressCMS, ThemeManager, etc.) │ ├── core/plugin/ # Plugin system (PluginManager, CMSAPI) -│ ├── lang/ # Translation files (nl.php, en.php) │ └── router.php # PHP dev server router (clean URLs) +├── language/ # Translation files (nl/, en/, de/ — each with site.php + admin.php) ├── admin/ # Admin console │ ├── config/ # Admin configuration (admin.json) │ ├── src/AdminAuth.php # Authentication, roles, permissions diff --git a/README.md b/README.md index 3bc7353..4ecb308 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,8 @@ codepress/ ├── cms/ # Core CMS engine │ ├── core/class/ # CMS classes (CodePressCMS, ThemeManager, etc.) │ ├── core/plugin/ # Plugin systeem (PluginManager, CMSAPI) -│ ├── lang/ # Taalbestanden (nl.php, en.php) │ └── router.php # PHP dev server router (schone URLs) +├── language/ # Taalbestanden (nl/, en/, de/ — elk met site.php + admin.php) ├── admin/ # Admin console │ ├── config/ # Admin configuratie (admin.json) │ ├── src/AdminAuth.php # Authenticatie, rollen, permissies diff --git a/TODO.md b/TODO.md index 5be141d..adb2c50 100644 --- a/TODO.md +++ b/TODO.md @@ -1,13 +1,56 @@ # TODO +## Voor elke versie verhoging. Deze nooit weghalen. +- [ ] Pentest controles uitgevoerd +- [ ] WCAG 2.1 AA accessibility tests +- [ ] Volledige git commit maken. +- [ ] Verslag maken voor opdrcht gever +- [ ] Na convormatie versie verhogen +- [ ] Bij Voltooid versie ophoging aanmaken en deze allemaal unvinken voor volgende ronde. + +## Te doen ⏳ + +- [ ] Multidomein implementeren (elk domein = eigen thema + content, één admin + site name) + - [ ] Fase 1: Config-resolutie + - [ ] For apache instants domein settings /public/noorlander.info/ or /public/mycode.name/ + - [ ] config.domains.json (registry: host, aliases, redirect, config) + .example + - [ ] cms/core/domain.php: normalizeHost/getDomainRegistry/resolveDomain/loadSiteConfigForHost + - [ ] cms/core/config.php refactor → herbruikbare functie, compatibel blijven + - [ ] Per-domein config-bestanden (content_dir, active_theme) in the main content dir. like: /content/domain1 /content/domain2 os /content/noorlander.info/ /content/mycode.name/ + - [ ] Fase 2: Front-end + - [ ] cms/router.php: taal-prefix dynamisch uit actieve config + - [ ] public/.htaccess: generieke `([a-z]{2})` taalregel + - [ ] CodePressCMS::getCurrentLanguage(): validatie via config['language']['available'] + - [ ] getInternalHosts(): registry-hosts toevoegen (cross-domein links = intern) + - [ ] public/index.php: /-media/ en /-assets/ via actieve content_dir + - [ ] Fase 3: Admin (domeinbeheer + switch) + - [ ] admin/config/app.php: domains_json pad + - [ ] public/admin.php: $_SESSION['admin_domain'] + routes domains/domain-switch + - [ ] domains.twig + sidebar-item/badge in admin.twig + - [ ] Bestaande handlers laten werken op actief domein (config_json/content_dir patchen) + - [ ] Fase 4: Housekeeping + - [ ] .gitignore: config.*.json, content-*/ + - [ ] AGENTS.md + config.json.example bijwerken + - [ ] Verificatie: php -l, curl met Host-header, domein-switch in admin testen + ## Voltooid ✅ - [x] Admin code en niet gebruikte mappen/bestanden opschonen - [x] version.php changelog verwijderen (staat in git) - [x] Guide mappenstructuur reorganiseren (NL/EN → rollen) - [x] README.md compacter maken met verwijzingen naar guide +- [x] Admin dashboard template check — Twig-commentaren `{# ... #}` verwijderd uit Dashboard.php +- [x] Plugins — zichtbaar verschil tussen system en content plugins (badge + border + icoon in plugins.twig) +- [x] Plugins — alleen actieve plugins zichtbaar in sidebar (PluginManager laadt alleen enabled plugins) +- [x] Plugins — dubbele enabled_plugins config opgelost (plugins.enabled verwijderd, alleen enabled_plugins op top-level) +- [x] Admin config — Analytics & Logging toggles verwijderd van config-pagina +- [x] Handleidingen gecontroleerd en bijgewerkt (20 bestanden NL+EN: configuratie, plugins, plugin-development, core-classes, theme-json, layouts, scss-styling, admin-beheerder, nieuw-thema, architectuur) +- [x] Content backup/restore optie + content-git repository integratie (ContentBackup class, content-backup.twig, ZIP backup/restore, git init/commit/log/restore) +- [x] Pentest controles uitgevoerd (30/30 tests geslaagd — 0 vulnerabilities) +- [x] WCAG 2.1 AA accessibility tests (25/25 tests geslaagd — 100% compliance, test-script verbeterd met min/max checks en grep -E) -## Te doen ⏳ - -- [ ] Pentest controles uitvoeren -- [ ] WCAG 2.1 AA accessibility tests +## v2.6.0 (2026-08-15) ✅ +- [x] Pentest controles uitgevoerd (30/30) +- [x] WCAG 2.1 AA accessibility tests (25/25) +- [x] Verslag gemaakt (docs/release-notes/v2.6.0.md) +- [x] Versie verhoogd naar 2.6.0 diff --git a/admin/config/admin.json.example b/admin/config/admin.json.example new file mode 100644 index 0000000..dcfc488 --- /dev/null +++ b/admin/config/admin.json.example @@ -0,0 +1,21 @@ +{ + "users": [ + { + "username": "admin", + "password_hash": "$2y$12$CV2uORTIiie6s3jf9ANaneL7VLNqA5smXyrIzkcJFjlS2Vxfw1/HK", + "role": "admin", + "email": "", + "author_name": "", + "author_email": "", + "created": "2025-01-01" + } + ], + "security": { + "session_timeout": 1800, + "max_login_attempts": 5, + "lockout_duration": 900 + }, + "config": { + "default_page": "auto" + } +} \ No newline at end of file diff --git a/admin/src/AdminAuth.php b/admin/src/AdminAuth.php index a5fdf22..a1e862d 100644 --- a/admin/src/AdminAuth.php +++ b/admin/src/AdminAuth.php @@ -16,7 +16,7 @@ class AdminAuth */ public const ROLE_PERMISSIONS = [ 'admin' => ['*'], - 'content-manager' => ['dashboard', 'content', 'content-edit', 'content-new', 'content-delete', 'content-dir-create', 'content-dir-rename', 'content-dir-delete', 'content-move', 'guide', 'logout'], + 'content-manager' => ['dashboard', 'content', 'content-edit', 'content-new', 'content-delete', 'content-dir-create', 'content-dir-rename', 'content-dir-delete', 'content-move', 'content-backup', 'content-restore', 'content-git-init', 'content-git-commit', 'content-git-restore', 'guide', 'logout'], 'bi-manager' => ['dashboard', 'statistics', 'logs', 'guide', 'logout'], 'site-admin' => ['dashboard', 'theme', 'theme-new', 'plugins', 'plugins-new', 'plugins-edit', 'plugins-config', 'plugins-toggle', 'plugins-delete', 'statistics', 'logs', 'update', 'guide', 'logout'], ]; @@ -28,7 +28,7 @@ class AdminAuth 'admin' => 'Admin', 'content-manager' => 'Content Beheerder', 'bi-manager' => 'BI Beheerder', - 'site-admin' => ' Site Admin', + 'site-admin' => 'Site Admin', ]; public function __construct(array $appConfig) @@ -170,10 +170,19 @@ class AdminAuth if (!$this->isAuthenticated()) { return null; } - return [ - 'username' => $_SESSION['admin_user'], + $username = $_SESSION['admin_user']; + $userData = [ + 'username' => $username, 'role' => $_SESSION['admin_role'] ?? 'admin' ]; + // Enrich with profile fields from admin.json + $userEntry = $this->findUser($username); + if ($userEntry) { + $userData['email'] = $userEntry['email'] ?? ''; + $userData['author_name'] = $userEntry['author_name'] ?? ''; + $userData['author_email'] = $userEntry['author_email'] ?? ''; + } + return $userData; } /** @@ -244,13 +253,16 @@ class AdminAuth 'username' => $u['username'], 'role' => $role, 'role_label' => self::getRoleLabel($role), - 'created' => $u['created'] ?? '' + 'created' => $u['created'] ?? '', + 'email' => $u['email'] ?? '', + 'author_name' => $u['author_name'] ?? '', + 'author_email' => $u['author_email'] ?? '', ]; } return $users; } - public function addUser(string $username, string $password, string $role = 'admin'): array + public function addUser(string $username, string $password, string $role = 'admin', string $email = '', string $authorName = '', string $authorEmail = ''): array { if ($this->findUser($username)) { return ['success' => false, 'message' => 'Gebruiker bestaat al.']; @@ -266,6 +278,9 @@ class AdminAuth 'username' => $username, 'password_hash' => password_hash($password, PASSWORD_DEFAULT), 'role' => $role, + 'email' => $email, + 'author_name' => $authorName, + 'author_email' => $authorEmail, 'created' => date('Y-m-d') ]; $this->saveAdminConfig(); @@ -273,6 +288,24 @@ class AdminAuth return ['success' => true, 'message' => 'Gebruiker aangemaakt.']; } + /** + * Update the profile (email, author_name, author_email) of a user. + */ + public function updateUserProfile(string $username, string $email = '', string $authorName = '', string $authorEmail = ''): array + { + foreach ($this->adminConfig['users'] as &$userEntry) { + if ($userEntry['username'] === $username) { + $userEntry['email'] = $email; + $userEntry['author_name'] = $authorName; + $userEntry['author_email'] = $authorEmail; + $this->saveAdminConfig(); + $this->log('info', "Profiel bijgewerkt: {$username}"); + return ['success' => true, 'message' => 'Profiel opgeslagen.']; + } + } + return ['success' => false, 'message' => 'Gebruiker niet gevonden.']; + } + /** * Change the role of an existing user. */ diff --git a/admin/theme/default/views/layouts/admin.twig b/admin/theme/default/views/layouts/admin.twig index e42b2a9..1417104 100644 --- a/admin/theme/default/views/layouts/admin.twig +++ b/admin/theme/default/views/layouts/admin.twig @@ -1,9 +1,9 @@ - + - {% block title %}CodePress Admin{% endblock %} + {% block title %}{{ ta.admin_title|default('CodePress Admin') }}{% endblock %} @@ -37,98 +37,95 @@